PDA

View Full Version : سوال: کاربرد کلاس Task<t> در برنامه نویسی غیر همزمان



Black_Hammer
جمعه 19 آذر 1395, 18:29 عصر
سلام دوستان من یک سوال داشتم که ممنون می شم راهنمایی بفرمایید اگه ممکنه لینک نزارین و خودتون توضیح بدید چون من اینترنت رو ترکوندم انقدر سرچ کردم:گریه:

سوال بنده در باره کلاس Task هست . من از برنامه نویسی غیر هم زمان فقط اینو می دونم که دوتا کلمه کلید به نام های async و await داریم که کلمه کلید async باعث فعال شدن await می شه و کلمه await باعث می شه کاری که قراره زمانبر باشه مثل دسترسی به یک فایل توی اینترنت به صورت غیر همزمان انجام بشه و از روال عادی برنامه خارج بشه تا برنامه به قول معروف هنگ نکنه. حالا سوال من اینجاست کلاس task چی کار می کنه . من متدی دیدم که هنگام تعریف ، نوع برگشتی خودش رو از نوع Task جنریک معرفی می کنه و به اون مقدار برگشتی می ده .

کلا این کلاس چطور کار می کنه و
به چه درد می خوره و
چطور می تونیم به مقادیرش دسترسی پیدا کنیم.


ممنون می شم راهنمایی بفرمایید.

0verlord
یک شنبه 21 آذر 1395, 15:23 عصر
دوست عزیز سوالال شما خیلی کلی هست و اگه بخوایم وارد جزییات بشیم باید چندین صفحه مطلب نوشت!! به شما توصیه میکنم فصل 14 کتاب C#in a nutshell رو بخونید عنوان فصل :Concurrency and Asynchrony
خیلی خوب این مبحث رو توضیح داده ( برای تکمیل شدن مبحث فصل 22 و 23 رو هم بخونید )

متاسفانه رفرنس فارسی سراغ ندارم که به شما معرفی کنم برای همین یه جواب خیلی کلی اینجا مینویسم:
کلاس Task یه متد (به صورت delegate) از شما میگیره و اون رو روی ترد از thread pool اجرا میکنه...همین!!! این کلاس تعدادی event و property داره که مربوط به این هستن که آیا اجرای متد شما به پایان رسیده یا خیر

async و await هم به کامپایلر میگن که کد شما رو چطور تفسیر کنه....یعنی وقتی کامپایلر میبنه که شما یه تسک رو await کردی کدها و عبارتهای بعد اون رو به داخل بدنه اونت کامل شدن تسک منتقل میکنه (OnCompleleted) و کنترل رو به ترد اصلی که تسک رو تعریف کرده بر میگردونه
به این ترتیب ترد اصلی بدون بلاک شدن به کار خودش ادامه میده و هر وقت نتیجه تسک مشخص شد، با اجرای اونت برمیگرده و عبارت های بعد از تسک رو که اجراشون به نتیجه تسک بستگی داشت اجرا میکنه

این مثال شاید به درک مطلب کمک کنه:

var result = await expression;
statement(s);


وقتی کامپایلر کد بالا رو میبینه به یه چیزی شبیه به این تغییرش میده:

var awaiter = expression.GetAwaiter();
awaiter.OnCompleted (() =>
{
var result = awaiter.GetResult();
statement(s);
});