در net. الگوی TAP رویکرد توصیه شده برای برنامه نویسی async در پروژه های جدید است.
این الگو بر پایه استفاده از آیتم های زیر بنا شده است :
-
- NameSpace : System.Threading.Tasks
-
- <Classes : Task , Task<TResult
قانون نامگذاری ( naming convention ) :
-
- الگوی TAP از یک method واحد برای نمایش شروع و تکمیل یک عملیات async استفاده می کند.
-
- پسوند Async بعد از نام عملیات برای method هایی که در آنها یک Task از نوع awaite تعریف شده قرار میگیرد. به عنوان مثال، یک عملیات Get از نوع async میتواند GetAsync نامگذاری شود.
- پسوند Async بعد از نام عملیات برای method هایی که در آنها یک Task از نوع awaite تعریف شده قرار میگیرد. به عنوان مثال، یک عملیات Get از نوع async میتواند GetAsync نامگذاری شود.
مقادیر برگشتی ( Return Values ) :
-
- اگر مقدار بازگشتی از نوع void باشد خروجی method به شکل زیر خواهد بود :
-
- { … }(…)public Task ReadAsync
-
- اگر method دارای مقدار بازگشتی غیر از void باشد از فرم زیر پیروی میکند:
-
- { … }(…)public Task<Product> FindFilesAsync
پارامترها ( Parameters ) :
-
- به طور کلی باید از پارامترهای out و ref اجتناب کرد.
-
- استفاده از پارامتر CancellationToken پیشنهاد میشود.
TaskStatus :
-
- کلاس Task یک چرخه عمر برای عملیات async ارائه می دهد و این چرخه عمر توسط شمارشگر TaskStatus نشان داده می شود.
-
- برای پشتیبانی از موارد خاص و همچنین برای پشتیبانی از جداسازی Construction از Scheduling ، کلاس Task یک متد Start دارد.
Cold Tasks :
-
- Task هایی که توسط public constructor کلاس ایجاد میشوند، به عنوان Cold Task شناخته می شوند، زیرا آنها فعالیت خود را در حالت non-scheduled Created آغاز می کنند و فقط زمانی scheduled می شوند که Start روی این نمونه ها فراخوانی شود.
Hot Tasks :
-
- همه Task های دیگر در متد async فعالیت خود را در hot state آغاز می کنند، بدین معنی که عملیات async ای که آنها نشان می دهند، قبلاً آغاز شده و وضعیت Task آنها مقداری از TaskStatus به جز TaskStatus.Created است.
-
- این نوع Task ها نیازی به فراخوانی متد Start ندارند.
Cancellation :
-
- استفاده از این ویژگی هم برای پیادهسازان متدهای async و هم برای مصرفکنندگان متدهای async اختیاری است.
-
- ارائه قابلیت لغو برای عملیات async بوسیله یک توکن لغو ( CancellationToken ) که بر اساس قرارداد، cancellationToken نامگذاری میشود امکانپذیر میشود.
-
- { … }(…)public Task ReadAsync(byte [ ] buffer, int offset, int count,CancellationToken cancellationToken)
-
- عملیات async این توکن را برای درخواستهای لغو بررسی میکند:
-
- اگر یک درخواست لغو دریافت کند، ممکن است تصمیم بگیرد به آن درخواست احترام بگذارد و عملیات را لغو کند.
- اگر درخواست لغو منجر به پایان زودهنگام کار شود، متد TAP در حالت Canceled (لغو شده) به پایان میرسد؛ و در این حالت هیچ نتیجهای در دسترس نیست و هیچ exception ای نیز throw نمیشود.
- حالت Canceled به همراه حالتهای Faulted (با خطا مواجه شده) و RanToCompletion (با موفقیت به پایان رسیده) به عنوان یک حالت نهایی (تکمیل شده) برای یک Task در نظر گرفته میشود.
- اگر یک Task در حالت Canceled باشد، خاصیت IsCompleted آن مقدار true را برمیگرداند.
- هنگامی که یک Task در حالت Canceled تکمیل می شود، هر فعالیتی که با Task ثبت شده است، scheduled یا run میشود، مگر اینکه گزینه NotOnCanceled برای خروج از روند اجرا برای آن مشخص شده باشد.
- برای متدهایی که قابل لغو نیستند، توکن لغو را فعال نکنید و از این قابلیت استفاده نکنید؛ این به فراخواننده کمک می کند تا تشخیص دهد که آیا متد async واقعاً قابل لغو است یا خیر.
-
- الگوریتمی که لغو را نمیخواهد، میتواند یک متد را فراخوانی کند که یک CancellationToken را میپذیرد و None را به عنوان مقدار آرگومان ارائه دهد. None از نظر عملکردی معادل پیشفرض CancellationToken است.
- اگر یک درخواست لغو دریافت کند، ممکن است تصمیم بگیرد به آن درخواست احترام بگذارد و عملیات را لغو کند.
Progress reporting :
-
- برخی از عملیاتهای async از ارائه notification های مخصوص نحوه پیشرفت عملیات بهرهمند میشوند و معمولاً از آنها برای بهروزرسانی UI با اطلاعات مربوط به پیشرفت عملیات async استفاده میشود.
-
- گزارش پیشرفت اختیاری است.
-
- استفاده از این ویژگی از طریق تزریق یک پارامتر از نوع IProgress به متد async با نامی که معمولاً progress است، امکانپذیر میشود.
-
- <IProgress<T
-
- { .. }public Task ReadAsync(byte[] buffer, int offset, int count,IProgress<long> progress)
-
- در یک متد async فراخوانی progress میتواند برآوردی از درصد کار تکمیل شده و مجموعه فعلی نتایج جزئی را ارائه دهد.
-
- پارامتر progress میتواند دارای آرگومان null باشد، در این صورت هیچ پیشرفتی گزارش نمیشود.
-
- Progress به متد async اجازه میدهد تا پیشرفت کار را ارائه دهد. همچنین به مصرف کننده متد async اجازه می دهد تا تعیین کند که چگونه و کجا بهترین راه برای مدیریت اطلاعات است.
نویسنده: علی محمد بهمنیار