• 0
Mohsens22

تردینگ

سوال

با سلام

​یه سوال دارم در مورد اجرا کردن تسک.
​اول این که چطور کد متد رو فراخوانی کنیم، که اپلیکیشن منتظر تمام شدن اون متد نمونه ؟
​و دوم این که ما یک متد رو بدین شکل فراخوانی کردیم و به هر دلیلی امکان دارد که مثلا به زمان زیادی برای اجراش نیاز باشه
​چطور اون تسک رو کیل کنیم ؟

با تشکر.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

1 پاسخ به این سوال تا کنون داده شده است

  • 0

سلام

همونطور که میدونی، در سی شارپ نحوه اجرا کدها به این صورت هست که، هر خطی بدون اینکه منتظر نتیجه خط قبل بمونه اجرا میشه که اصطلاحا میگن سنکرون، سینک یا sync هست.

خیلی وقتها هم هست، که نیاز داریم تا نتیجه یک خطی برسه و ما پردازشمون رو روی نتیجه انجام بدیم، اینجا اون نظمی که توی برنامه نویسی سنکرون وجود داره، از بین میره و ما باید بریم سراغ برنامه نویسی آسنکرون یا async.

متدهای async امضاهای متفاوتی دارن، یکی از انواع رایج و غلطش نمونه زیر هست:

public async void MyMethodNameAsync()

این متد درسته که اجرا میشه و حتی میتونیم با await صداش بزنیم اما باید تسکی وجود داشته باشه که await بشه، تنها حالتی که میشه از  async void استفاده کرد، برای رویداد ها یا eventها هست.

اگر متدت چیزی برنمیگردونه باز هم باید از امضای async Task استفاده کنی، این یعنی متد void هست و چیزی برنمیگردونه:

public async Task MyMethodNameAsync()

اگر هم که متد چیزی برمیگردونه حتما میدونی، امضاش به شکل زیر هست:

public async Task<string> MyMethodNameAsync()

در مورد استفاده و صدا کردنش، راه رایج و درستی که همه میشناسیم await هست:

await MyMethodNameAsync();

گاهی اوقات هم ممکن هست که بخوایم در جایی متد رو صدا کنیم که نمیتونیم از async استفاده کنیم، که راه های زیر پیشنهاد میشه:

MyMethodNameAsync().Result;
MyMethodNameAsync().GetResult();
Task.Run(async () => await MyMethodNameAsync()).Result;
Task.Run(async() => await MyMethodNameAsync()).Wait()

البته پیشنهاد میکنم، تا جای ممکن از این روشه استفاده نکنید، این متدها میتونن باعث Dead Lock بشن، یعنی جایی برنامه به بینهایت میره، چند تابع رو اجرا میکنه، بعدش زمانی که میره یک متد async رو اجرا، یک دفعه دچار dead lock میشه.

یکی از روشهای سنکرون اجرا کردن توابع آسنکرون استفاده از RunSynchronously هست که شخصا باهاش تجربه خوبی نداشتم و باز هم با dead lock مواجه شدم:

MyMethodNameAsync().RunSynchronously();

در نهایت در مورد کنسل کردن تسک، از اونجایی که تجربه شخصی ندارم، نمیتونم توضیحاتی بنویسم، اما چیزی هست به اسم CancellationToken که دقیقا برای کنسل کردن تسک استفاده میشه و میتونی در موردش سرچ کنی.

 

موفق باشید

پسند شده توسط 5 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر


مهمان
این موضوع برای عدم ارسال قفل گردیده است.