آموزش Async در سیشارپ 5 - بخش دوم
يكشنبه, ۲۵ اسفند ۱۳۹۲، ۰۹:۵۴ ب.ظ
آشنایی با Task
قبل از اینکه Async در سیشارپ 5 پدیدار شود، دات نت در فریمورک 4، موجودی(!) به نام Task را معرفی کرد که زیرساخت اصلی Async در سیشارپ 5 است. Task برای راحتتر کردن و مدیریت بهتر ناهمگامی بوجود آمده است و امکانات فراوانی را در این زمینه در اختیار برنامه نویس قرار میدهد. اگر بخواهیم بهطور خلاصه شئ Task را تعریف کنیم، میتوان گفت Task یک عمل در حال اجرا را در خود کپسوله میکند و از طریق آن میتوانیم از وضعیت آن عمل باخبر شویم و یا آن را کنترل کنیم. البته این تعریف خیلی تعریف ساده ایست اما برای شروع مناسب است. در ادامه بیشتر با این موجود آشنا خواهید شد.
هنگامی که شما میخواهید یک سری عملیات را به صورت ناهمگام اجرا کنید، کافیست نمونهای از Task ایجاد کنید و مدیریت اجرای آن را به او بسپارید. به محض اینکه عملیات را به Task نسبت میدهید، Task یک Thread آزاد را از Thread Pool انتخاب میکند و عملیات شما را در آن Thread اجرا میکند. ممکن است بپرسید Thread Pool چیست؟
به طور خلاصه میتوان گفت که داتنت برای جلوگیری از هزینههای ایجاد و حذف Threadها، مجموعهای از Threadهای آماده به کار را فراهم کرده است و برنامهی شما در صورت نیاز به Thread، میتواند از این Threadها استفاده کند. هر Thread بعد از اتمام کار، دوباره به مجموعه باز میگردد (برای دریافت کار بعدی).
بنابراین Task به طور اتوماتیک یک Thread از مجموعه انتخاب میکند و با آن کار میکند و پس از اتمام کار، آن را به مجموعه باز میگرداند. اکنون با داشتن یکسری اطلاعات کلی در مورد Task، ادامهی آموزش را با مثالهای طبقه بندی شده بر اساس نوع عملیات پیش خواهم برد و نکات تکمیلی را اضافه خواهم کرد.
نوع اول) Fire and Go
در این نوع از عملیات، نتیجهی عملیات مهم نیست، فقط قرار است انجام شود و مهم نیست که کی و به چه شکل پایان مییابد. از اینجا به بعد یک تابع را به عنوان واحد عملیاتی در نظر خواهیم گرفت و به جای کلمهی عملیات از تابع استفاده میکنیم.
فرض کنید تابعی به شکل زیر دارید که قرار است عملیاتی طولانی انجام دهد:
public void DoJob(){
// Function Body
}
اگر بخواهیم تابع بالا را به روش Fire and Go و به صورت موازی اجرا کنیم، کافیست دستور زیر را اجرا کنیم:
Task.Run(()=>DoJob());
در حالتی هم که تابع مورد نظر، آرگومان ورودی داشته باشد، تنها کافیست هنگام فراخوانی با Task.Run، آرگومانها را در آن بنویسید. به همین سادگی!
در بخشهای بعدی با انواع مختلف مثالها و ابزارهای مدیریت Task بیشتر آشنا خواهید شد.