الگوهای برنامه نویسی Asynchronous

دات نت، سه الگو برای اجرای عملیات های ناهمزمان فراهم کرده است.

  • الگوی ناهمزمان مبتنی بر وظیفه یا Task-based Asynchronous Pattern که به اختصار TAP گفته میشود، از یک تابع برای شروع و اتمام یک عملیات ناهمزمان استفاده میکند. TAP در فریموورک 4 دات نت معرفی شد. توصیه مایکروسافت برای برنامه نویسی ناهمزمان استفاده از این الگوست. async و await در سی شارپ و Async و Await در ویژوال بیسیک کلمات کلیدی ای هستن که برای پشتیبانی از این الگو اضافه شده اند.
  • الگوی ناهمزمان مبتنی بر رویداد یا Event-based Asynchronous Pattern که به اختصار EAP گفته میشود، یک مدل منسوخ شده برای ارائه ی یک رفتار ناهمزمان است. یک متد با پسوند Async و یک یا چند event، even handler delegate و ... نیاز دارد .این الگو در دات نت فریموورک 2 معرفی شد که برای توسعه های جدید توصیه نمیشود.
  • مدل برنامه نویسی ناهمزمان یا Asynchronous Programming Model که به اختصار APM گفته میشود، که به ان الگوی IAsyncResult هم میگویند، یک مدل منسوخ شده است که از اینترفیس IAsyncResult برای یک رفتار ناهمزمان استفاده میکند.در این الگو، عملیات ناهمزمان به توابه Begin و
    End نیاز دارد. (به عنوان مثال BeginWrite, EndWrite برای پیاده سازی یک عملیات نوشتن فایل به صورت ناهمزمان) این الگو دیگر برای توسعه های جدید توصیه نمیشود.




مقایسه ی الگوها

برای یک مقایسه سریع، یک عملیات Read را در نظر بگیرید که مقدار مشخصی از داده را که در یک buffer وجود دارد، از offset مشخص بخواند.

public class MyClass 
{
      public int Read(byte [] buffer, int offset, int count);  
}

در الگوی TAP این متد به صورت زیر خواهد بود:

public class MyClass  
{ 
    public Task<int> ReadAsync(byte [] buffer, int offset, int count);  
}

در الگوی EAP اجزا زیر تعریف خواهند شد:

public class MyClass  
{
    public void ReadAsync(byte [] buffer, int offset, int count);  
    public event ReadCompletedEventHandler ReadCompleted;  
}

در APM دو متد BeginRead و EndRead پیاده سازی میشوند:

public class MyClass  
{  
    public IAsyncResult BeginRead( byte [] buffer, int offset, int count, 
               AsyncCallback callback, object state);  
    public int EndRead(IAsyncResult asyncResult);  
}