基於任務的非同步模式(Task-based Asynchronous Pattern,TAP),它使用單一的方法來表示非同步操作的啟動和完成。TAP 是在 .NET Framework 4 中引入的。它是 .NET 中非同步程式設計的推薦方法。C# 中的 async 和 await 關鍵字為 TAP 新增了語言支援。
基於事件的非同步模式(Event-based Asynchronous Pattern,EAP),這是基於事件的傳統模式,用於提供非同步行為。它需要一個具有 Async 後綴的方法和一個或多個事件。EAP 是在 .NET Framework 2.0 中引入的。它不再被推薦用於新的開發。
非同步程式設計模式(Asynchronous Programming Model,APM)模式,也稱為 IAsyncResult 模式,這是使用 IAsyncResult 介面提供非同步行為的傳統模式。在這種模式中,需要Begin和End方法同步操作(例如,BeginWrite和EndWrite來實現非同步寫操作)。這種模式也不再推薦用於新的開發。
下面簡單舉例對三種模式進行比較。
假設有一個 Read 方法,該方法從指定的偏移量開始將指定數量的資料讀入提供的緩衝區:
public class MyClass
{
public int Read(byte [] buffer, int offset, int count);
}
若用 TAP 非同步模式來改寫,該方法將是簡單的一個 ReadAsync 方法:
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;
}
public delegate void ReadCompletedEventHandler(
object sender, ReadCompletedEventArgs e);
public class ReadCompletedEventArgs : AsyncCompletedEventArgs
{
public MyReturnType Result { get; }
}
若使用 AMP 非同步模式,則需要定義兩個方法,一個用於開始執行非同步操作,一個用於接收非同步操作結果:
public class MyClass
{
public IAsyncResult BeginRead(
byte [] buffer, int offset, int count,
AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}
後兩種非同步模式已經過時不推薦使用了,這裡也不再繼續探討。歲數大點的 .NET 程式設計師可能比較熟悉後兩種非同步模式,畢竟那時候沒有 async/await,應該沒少折騰。
沒有留言:
張貼留言