新聞速報

        

2023年5月19日 星期五

回顧一下 .NET 歷史上提供的三種執行非同步操作的模式


基於任務的非同步模式(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,應該沒少折騰。

沒有留言:

張貼留言