2012-06-30 18 views
19

実際には何の違いがありますか非同期プログラミングモデルイベントベースの非同期パターン非同期プログラミングAPM対EAP

どのアプローチをいつ使用しますか?

+2

[MSDNのドキュメント](HTTP「は、IAsyncResultパターンを生成するためのオプションで、デフォルトではイベントベースのパターンを生成する」のように聞こえます: //msdn.microsoft.com/en-us/library/jj152938.aspx)これをかなりうまくカバーします。 –

+0

すばらしい記事!間違いなくブックマークコレクションに追加されました。 – Erik

答えて

17

非同期プログラミングモデルAPMは)あなたがBeginMethod(...)EndMethod(...)ペアで参照モデルです。例えば

ここAPM実装使用してSocketさ:

var socket = new Socket(AddressFamily.InterNetwork, 
         SocketType.Stream, ProtocolType.Tcp); 

// ... 

socket.BeginReceive(recvBuffer, 0, recvBuffer.Length, 
        SocketFlags.None, ReceiveCallback, null); 

void ReceiveCallback(IAsyncResult result) 
{ 
    var bytesReceived = socket.EndReceive(result); 

    if (bytesReceived > 0) { // Handle received data here. } 

    if (socket.Connected) 
    { 
    // Keep receiving more data... 
    socket.BeginReceive(recvBuffer, 0, recvBuffer.Length, 
         SocketFlags.None, ReceiveCallback, null); 
    } 
} 

イベントベースの非同期パターンEAPは)あなたがMethodAsync(...)CancelAsync(...)ペアで参照モデルです。通常はCompletedというイベントがあります。このパターンの良い例はBackgroundWorkerです。 C#4.5のよう

、両方ともタスクの並列ライブラリTPL)を使用しているasync/awaitパターン、により置換されています。メソッド名の後にAsyncのマークが付いていて、通常はTaskまたはTask<TResult>が返されます。 .NET 4.5をターゲットにできる場合は、このパターンをAPMまたはEAPデザインよりも確実に使用する必要があります。

public static async Task CompressFileAsync(string inputFile, string outputFile) 
{ 
    using (var inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read)) 
    using (var outputStream = File.Create(outputFile)) 
    using (var deflateStream = new DeflateStream(outputStream, CompressionMode.Compress)) 
    { 
    await inputStream.CopyToAsync(deflateStream); 

    deflateStream.Close(); 
    outputStream.Close(); 
    inputStream.Close(); 
    } 
} 
5

をクライアントコードのPOVから:

EAP:あなたは名前が「完了で終わるイベントのイベントハンドラを設定(潜在的に大きな)非同期にファイルを圧縮する例えば

、名前が "Async"で終わるメソッドを呼び出します。名前に "Cancel"というメソッドを呼び出して、それを取り消すことがあります。

APM:名前が "Begin"で始まり、その結果をポーリングしたり、コールバックを受信したメソッドを呼び出し、 "End"で始まるメソッドを呼び出します。

私が知っている限り、APMはほとんどのBCL IOクラスとWCFで実装されています(主に結果を無視するだけでキャンセルできます)。 EAPは、より高いレベルのクラス、すなわち、複数のステップと何らかの有意義な取り消し動作があるファイルをダウンロードすることに見られる。

あなたが実装するものを選択する必要がある場合(そしてあなたはこれらの2つを意図的に制限しています)、あなたがやっていることは取り消し可能であるかどうかはわかりません。

クライアントコードPOVからは必ずしも選択肢がありません。できるだけC#4.5のタスクを使用するのが最善の方法ですが、ラッパーを使用して古い非同期メカニズムのいずれかを使用することができます。

+2

__APM__デザインのキャンセル機能が欠けていることの良い点。また、前述のように、 'Task.Factory.FromAsync(...)'は、__APM__スタイルを__TPL__パターンに変換するためのC#4.5ラッパーです。参照してください: Erik

+0

申し訳ありませんが、ここでSOのコメントと戦っています(なぜ、「サポートされている」リンク形式のほとんどがコメントで機能していますか?) [TPLと従来の.NET非同期プログラミング](http://msdn.microsoft.com/en-us/library/dd997423.aspx) – Erik

関連する問題