次の方法で共有


非同期プログラミング パターン

.NET には、非同期操作を実行するための 3 つのパターンが用意されています。

  • タスク ベースの非同期パターン (TAP)。1 つのメソッドを使用して非同期操作の開始と完了を表します。 TAP は .NET Framework 4 で導入されました。 これは、.NET での非同期プログラミングに推奨されるアプローチです。 C# の async キーワードと await キーワード、および Visual Basic の Async 演算子と Await 演算子により、TAP の言語サポートが追加されます。 詳細については、「 タスク ベースの非同期パターン (TAP)」を参照してください。

  • イベント ベースの非同期パターン (EAP) は、非同期動作を提供するためのイベント ベースのレガシ モデルです。 Async サフィックスと 1 つ以上のイベント、イベント ハンドラー デリゲート型、およびEventArg派生型を持つメソッドが必要です。 EAP は .NET Framework 2.0 で導入されました。 新しい開発には推奨されなくなりました。 詳細については、「 イベント ベースの非同期パターン (EAP)」を参照してください。

  • 非同期プログラミング モデル (APM) パターン (IAsyncResult パターンとも呼ばれます) は、IAsyncResult インターフェイスを使用して非同期動作を提供するレガシ モデルです。 このパターンでは、非同期操作には Begin メソッドと End メソッド (非同期書き込み操作を実装するための BeginWriteEndWrite など) が必要です。 このパターンは、新しい開発では推奨されなくなりました。 詳細については、「 非同期プログラミング モデル (APM)」を参照してください。

パターンの比較

3 つのパターンが非同期操作をモデル化する方法を簡単に比較するには、指定したオフセットから始まる指定されたバッファーに指定した量のデータを読み取る 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;  
}  

対応する APM は、 BeginRead メソッドと EndRead メソッドを公開します。

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

こちらも参照ください