私のアプリケーションは、多くの同時TCP接続を受け入れ、クライアントが接続されるたびにsocket.BeginReceive(...)
またはsocket.ReceiveAsync(SocketAsyncEventArgs e)
に電話します。私はすべての私のBeginReceive()
呼び出しが1つのスレッドによって処理されるか、またはそれぞれの呼び出しが異なるバックグラウンドスレッドによって処理されるかどうかを知りたいですか?C#/ .NETのすべての非同期API呼び出しは、バックグラウンドで別のスレッドを消費しますか?
答えて
答えはいいえ、次のように読むことができます。
MSDN Asynchronous Programming with Async and Await (C# and Visual Basic) スレッド
非同期メソッドが動作の非ブロッキングであることが意図されます。待機しているタスクが実行されている間は、非同期メソッドでの式の待機は現在のスレッドをブロックしません。代わりに、式は残りのメソッドに継続として署名し、asyncメソッドの呼び出し元に制御を返します。
asyncキーワードとawaitキーワードでは、追加のスレッドが作成されません。 Asyncメソッドは、独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。このメソッドは、現在の同期コンテキストで実行され、メソッドがアクティブな場合にのみスレッド上の時間を使用します。 Task.Runを使用してCPUバインドされた作業をバックグラウンドスレッドに移動できますが、バックグラウンドスレッドは結果が利用可能になるのを待っているプロセスには役立ちません。
非同期プログラミングに対する非同期式のアプローチは、ほとんどすべてのケースで既存のアプローチよりも優れています。特に、コードが簡単で競合状態を防ぐ必要がないため、このアプローチはIOバインド操作ではBackgroundWorkerより優れています。 Task.Runと組み合わせて、非同期プログラミングは、Task.Runがスレッドプールに転送する作業からコードを実行する調整の詳細を非同期プログラミングが分離するため、CPUバインド操作のためにBackgroundWorkerより優れています。
ありがとうLepijohnny、私は説明セクションで説明したように、私の質問は、Beginxxx、Endxxxパターンを使用するsocket.BeginReceive(..)、BeginSend(..)および他のすべてのドットネットAPIに関連しています。私の質問は、非同期/待機のシナリオ用ではありません。 – Shakeel
@Shakeel実際には 'async/await'がルールであり例外ではありません。人々が「非同期API」について話すとき、タスクを返すそれらを意味します。 'Begin/End' APIは、過去4〜5年間、遺産とみなされています。 'async/await'を使ってソックス[実際に使用されている](http://stackoverflow.com/a/1388691/134204) –
@Shakeelあなたが書いたことは[APMパターン](https://msdn.microsoft.com/en-us/library/ms228963(v = vs.110).aspx) –
複数の同時非同期呼び出しでは、ここで説明する複数のバックグラウンドスレッドは開かれません。blog.stephencleary.com/2013/11/there-is-no-thread.html
すべてのクレジットは、このリンクとリンクの元の著者を提案するために@Evkに行きます。
- 1. バックグラウンドで同期してAPI呼び出しを行うには?
- 2. C#非同期呼び出しのタイムアウト
- 3. C#での非同期シリアルポート呼び出しの同期クラスライブラリ
- 4. UIスレッドで同期メソッドを非同期で呼び出す
- 5. 非同期に非同期デリゲートを呼び出しますか?
- 6. 複数の非同期呼び出しをスレッドする
- 7. 別スレッドの非同期NSURLConnectionがデリゲートメソッドの呼び出しに失敗する
- 8. 非同期メソッド呼び出しを使用すると、.netスレッドでのパフォーマンスが向上しますか
- 9. 非同期API呼び出しを再帰的に呼び出します。
- 10. UIスレッドの非同期呼び出しを同期呼び出しに変換する
- 11. API呼び出しを非同期で行います
- 12. Pythonでの同期呼び出しへの非同期呼び出し
- 13. 同期UIスレッドからのコールバックで非同期メソッドを呼び出す
- 14. C#非同期呼び出しの同期化
- 15. Swift 3.0の非同期スレッドからUIAlertControllerを呼び出す
- 16. 非同期C#のシェルへの呼び出しが新しいスレッドを開いていますか?
- 17. 非同期呼び出しは常に新しいスレッドを作成/呼び出しますか?
- 18. 非同期呼び出し
- 19. 非同期呼び出しでのハンドルリダイレクト
- 20. 非同期Java Webサービス呼び出しの呼び出し
- 21. コールバックを使用した.NET非同期Webサービス呼び出し
- 22. ComponentDidMountでの非同期API呼び出しの作成
- 23. Javaスレッド内で非同期メソッドを呼び出す方法は?
- 24. ThreadPool.QueueUserWorkItemスレッド内で非同期呼び出しを使用
- 25. 非同期呼び出しでAddSingletonを呼び出しますか?
- 26. のstd ::非同期呼び出し
- 27. 多くの時間を消費/消費するビューモデル呼び出しの呼び出しメソッド
- 28. Javaから非同期で.NET Webサービスを呼び出す
- 29. 別のスレッドからスレッドで非スレッドセーフなメソッドを呼び出す
- 30. .NET Prism4 WVVM + WPF非同期呼び出しのベストプラクティス
[msdn - async](https://msdn.microsoft.com/library/hh191443(vs.110).aspx#Anchor_2) –
この情報もまた興味深いかもしれません:http://blog.stephencleary.com/ 2013/11/there-is-no-thread.html – Evk
*スレッドをまったく消費しません。 'await' *非同期操作が完了するのを待ってから、元のUIスレッドのような同じ実行コンテキストで続行します。 –