答えて
非同期プログラミングモデル(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();
}
}
をクライアントコードのPOVから:
EAP:あなたは名前が「完了で終わるイベントのイベントハンドラを設定(潜在的に大きな)非同期にファイルを圧縮する例えば
、名前が "Async"で終わるメソッドを呼び出します。名前に "Cancel"というメソッドを呼び出して、それを取り消すことがあります。
APM:名前が "Begin"で始まり、その結果をポーリングしたり、コールバックを受信したメソッドを呼び出し、 "End"で始まるメソッドを呼び出します。
私が知っている限り、APMはほとんどのBCL IOクラスとWCFで実装されています(主に結果を無視するだけでキャンセルできます)。 EAPは、より高いレベルのクラス、すなわち、複数のステップと何らかの有意義な取り消し動作があるファイルをダウンロードすることに見られる。
あなたが実装するものを選択する必要がある場合(そしてあなたはこれらの2つを意図的に制限しています)、あなたがやっていることは取り消し可能であるかどうかはわかりません。
クライアントコードPOVからは必ずしも選択肢がありません。できるだけC#4.5のタスクを使用するのが最善の方法ですが、ラッパーを使用して古い非同期メカニズムのいずれかを使用することができます。
包括的な答えは、MSDNの記事"Deciding When to Implement the Event-based Asynchronous Pattern"にあります。
(あなたの質問への短い答え)この記事の主なアイデアは、
- 1. 非同期プログラミング:
- 2. Silverlight EAPとAPMとWCFサービス
- 3. 非同期プログラミング問題
- 4. タスク非同期のC#プログラミング
- 5. 角度の非同期プログラミング
- 6. JavaScriptの非同期プログラミング
- 7. C#での非同期プログラミング
- 8. 同期対非同期データベースへのアクセス
- 9. リアルタイムアプリケーションの非同期対同期ソケットサーバー
- 10. Pythonでの非同期プログラミングTwisted
- 11. Javaでの非同期プログラミング - バックグラウンドプロセス
- 12. タスクを使用した非同期プログラミング
- 13. のVisual Studio 2010の非同期プログラミング
- 14. 非同期プログラミング(NodeJS)の使用
- 15. .NETコアによる非同期プログラミング?
- 16. ノードJSのイベントループブロッキングと非同期プログラミング
- 17. 非同期タスク - Java対応
- 18. MongoDBの.toArray .each対(非同期対ブロック?)
- 19. 非同期プログラミングと比較した並列プログラミング
- 20. PhpStorm-EAP:リモートサーバー上の変更を同期
- 21. PhpStorm-EAP:リモートサーバーとファイルを同期する
- 22. 非同期代行者対スレッド
- 23. 非同期メソッド非同期に新
- 24. 非同期操作と非同期ネットワークタスク?
- 25. NodeJs - 非同期/非同期/待機中
- 26. 非同期ループ内の非同期メソッド
- 27. 春非同期 - 非同期豆に
- 28. 非同期メソッドの非同期メソッド
- 29. 非同期、非同期待機
- 30. 非同期プログラミングとループで待ちます
[MSDNのドキュメント](HTTP「は、IAsyncResultパターンを生成するためのオプションで、デフォルトではイベントベースのパターンを生成する」のように聞こえます: //msdn.microsoft.com/en-us/library/jj152938.aspx)これをかなりうまくカバーします。 –
すばらしい記事!間違いなくブックマークコレクションに追加されました。 – Erik