10

[…]Async と Begin[…] .net 非同期 API の違いの質問を見つけましたが、この回答は少し混乱しました。

これらのパターンについて、Stephen 氏は次のように述べています。

ほとんどの *Async メソッド (対応する *Completed イベントを含む) は、イベント ベースの非同期パターンを使用しています。古い (しかし完全に有効な) Begin* と End* は、非同期プログラミング モデルと呼ばれるパターンです。

Socket クラスはこの規則の例外です。その *Async メソッドには対応するイベントがありません。基本的には、過剰なメモリ割り当てを回避するために行われる APM にすぎません。

少なくともソケットに関しては、* Async メソッドを使用する方が効率的です。しかし、その後、彼は Task Parallel Library について言及しました。

ただし、APM と EBAP はどちらも、Task Parallel Library に基づくより柔軟なアプローチに置き換えられています。TPL は APM を簡単にラップできるため、古いクラスは直接更新されない可能性があります。拡張メソッドは、古い APM メソッドに相当するタスクを提供するために使用されます。

MSDN でTPL と従来の .NET 非同期プログラミングを見つけました。TPLの基本、タスクの作成、キャンセル、継続などは知っていますが、これらをまだ理解できていません。

非同期プログラミング モデル (APM) とイベント ベースの非同期パターン (EAP) を比較した場合の利点は何ですか? TPL で APM を簡単にラップできるとは、APM と EAP の両方が TPL に置き換えられることを意味します?

そして最も重要なのは、ソケットプログラミングでどちらを使用する必要があるかです。

  • APM?
  • えっ?
  • タスクによってラップされた APM または EAP?
  • タスクで Socket クラスのブロッキング メソッドを使用して TPL を実行しますか?
  • 他の?
4

2 に答える 2

7

TPL で APM を簡単にラップできるとは、APM と EAP の両方が TPL に置き換えられることを意味しますか?

そうではありません。APM と EAP が TAP (タスク非同期パターン) に置き換えられるかどうかは、これとは関係ありません。さまざまな理由から、TAP が APM と EAP に置き換わることを期待しています。私にとっての主な理由は、TAP を使用するために作成したコードの構成がはるかに優れていることです。.ContinueWith(/* ... */).ContinueWith(/* ... */)継続を実行する必要があるかどうかを判断するために ContinueWith に渡すことができるオプションを考慮しなくても、Begin/End メソッドを介して非同期呼び出しをチェーンするために記述する必要がある対応するコードよりも、一般的に実行するほうがはるかに読みやすくなります。TPL には、 や などのタスクのさまざまなコンビネータも用意されてWaitAllおりWaitAny、一部のシナリオをはるかに簡単にすることができます。async/await キーワードを介して C# および VB.NET で提供される言語サポートにより、これがさらに容易になります。

TAP で APM をラップできると、新しいモデルに適合させるために既存のコードを書き直す必要がないため、このパターンへの切り替えが容易になります。

ソケットプログラミングではどれを使用すればよいですか?

Socket で APM メソッドをラップする TAP を使用することをお勧めします。Begin/End メソッドを Task にラップする余分なオーバーヘッドが、スケーラブル/十分に高速かどうかの違いであることを証明できない限り、TAP のコーディングの容易さを利用します。

于 2012-07-03T04:20:19.213 に答える
4

ギデオンは素晴らしい答えを持っていました。もう少し背景を提供したかっただけです:

非同期プログラミング モデル (APM) とイベント ベースの非同期パターン (EAP) を比較した場合の利点は何ですか?

APM はより一般的で、かなり厳密に定義されたパターンを持っています。たとえば、TPL には APM メソッドの汎用ラッパーがあります ( TaskFactory.FromAsync) が、EAP は厳密に定義されていないため、EAP に対して同じことはできません。

EAP には 1 つの大きな利点があります。それは、イベント コールバックがスレッドのマーシャリングを処理することです。そのため、たとえば UI の基本的なバックグラウンド操作 ( BackgroundWorker) には非常に適しています。

TAP は、既定の自動スレッド マーシャリングと、厳密に定義された共通パターンという、両方の長所を兼ね備えています。また、非同期操作の優れたオブジェクト表現も備えています ( Task)。

「TPL は APM を簡単にラップできる」とは、「APM と EAP の両方が TPL に置き換えられている」ことをどのように意味しますか?

そうではありません。

「しかし、APM と EBAP はどちらも、Task Parallel Library に基づくより柔軟なアプローチに置き換えられています。」- 新しいコードに APM/EAP メソッド/イベントを含める必要がないことを意味します。新しいコードには、代わりに TAP メソッドを含める必要があります。

「TPL は APM を簡単にラップできるため、古いクラスは直接更新されない可能性があります。拡張メソッドは、古い APM メソッドに相当するタスクを提供するために使用されます。」- を使用して既存の APM タイプに TAP メソッドを追加できることを意味しますTaskFactory.FromAsync。私は、TPL チームが BCL の大量のクラスを変更するのではなく、このアプローチを取るだろうと考えました。しかし、この推測は間違っていました。パフォーマンス上の理由から、BCL/TPL チームはフレームワーク全体を見直し、拡張メソッドを使用する代わりに TAP メソッドを .NET クラスに直接追加しました。新しい TAP メソッドは .NET 4.5 に含まれており、近日公開予定です...

于 2012-07-15T00:58:42.007 に答える