非同期プログラミングのパターン
.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
メソッドが必要になります (たとえば、非同期書き込み操作を実装するためのBeginWrite
とEndWrite
)。 このパターンは、新規の開発では推奨されなくなりました。 詳細については、「非同期プログラミング モデル (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);
}