Task-based asynchronous pattern (TAP) in .NET

    1. مفهوم async و sync در asp.net
    2.  معرفی الگوهای برنامه نویسی async در net.

  1.  

در net.  الگوی TAP  رویکرد توصیه شده برای برنامه نویسی async در پروژه های جدید است.

این الگو بر پایه استفاده از آیتم های زیر بنا شده است :

    • NameSpace : System.Threading.Tasks

    • <Classes : Task , Task<TResult


قانون  نامگذاری ( naming convention ) :

    • الگوی TAP از یک method واحد برای نمایش شروع و تکمیل یک عملیات async استفاده می کند.

    • پسوند 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  اجازه می دهد تا تعیین کند که چگونه و کجا بهترین راه برای مدیریت اطلاعات است.


منبع : https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap

نویسنده: علی محمد بهمنیار

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

مجتمع فنی تهران

دپارتمان ICT