59

Post() または SendAsync() を介してアイテムを送信することの違いについて混乱しています。私の理解では、すべての場合において、アイテムがデータ ブロックの入力バッファーに到達すると、制御は呼び出し元のコンテキストに返されますよね? では、なぜ SendAsync が必要になるのでしょうか? 私の仮定が間違っているとしたら、反対に、データ ブロックを使用する全体的なアイデアが同時実行および非同期環境を確立することである場合、なぜ誰かが Post() を使用するのでしょうか。

もちろん、Post() が bool を返すのに対し、SendAsync は bool の待機可能な Task を返すという点で、技術的に違いを理解しています。しかし、それにはどのような意味があるのでしょうか? bool の戻り値 (項目がデータ ブロックのキューに配置されたかどうかの確認であると理解しています) はいつ遅延しますか? async/await 同時実行フレームワークの一般的な考え方は理解していますが、ここではあまり意味がありません。ブール値以外に、渡されたアイテムに対して行われた結果は呼び出し元に返されることはなく、代わりに「out-queue」で、リンクされたデータ ブロックに転送されるか、破棄されます。

また、アイテムを送信する際に、2 つの方法にパフォーマンスの違いはありますか?

4

2 に答える 2

20

ドキュメントは、これを合理的に明確にしています、IMO。特に、次の場合Post:

このメソッドは、ターゲット ブロックがアイテムを受け入れるか拒否するかを決定すると戻りますが、ターゲット ブロックの特別なセマンティクスによって別の方法で指示されない限り、アイテムが実際に処理されるまで待機しません。

と:

提供されたメッセージの延期をサポートするターゲット ブロック、またはPost実装でより多くの処理を行う可能性のあるブロックの場合は、 を使用することを検討してSendAsyncくださいSendAsync

言い換えれば、両方ともメッセージの処理に関して非同期ですが、ターゲット ブロックがメッセージを非同期的に受け入れるSendAsyncかどうかを決定できるようにします。

一般的に「より非同期的なSendAsync」アプローチであり、おそらく一般的に推奨されているアプローチのようです。私には明らかではないPostのは、なぜ両方が必要なのかということです。確かに、使用してSendAsyncから結果を待つこととほぼ同じように聞こえるからです。コメントで述べたように、大きな違い1 つあります。バッファがいっぱいの場合Postはすぐに拒否されますが、そうではありSendAsyncません。

于 2012-11-28T07:09:50.227 に答える