2016-12-05 13 views
0

私のアプリケーションは、多くの同時TCP接続を受け入れ、クライアントが接続されるたびにsocket.BeginReceive(...)またはsocket.ReceiveAsync(SocketAsyncEventArgs e)に電話します。私はすべての私のBeginReceive()呼び出しが1つのスレッドによって処理されるか、またはそれぞれの呼び出しが異なるバックグラウンドスレッドによって処理されるかどうかを知りたいですか?C#/ .NETのすべての非同期API呼び出しは、バックグラウンドで別のスレッドを消費しますか?

+0

[msdn - async](https://msdn.microsoft.com/library/hh191443(vs.110).aspx#Anchor_2) –

+2

この情報もまた興味深いかもしれません:http://blog.stephencleary.com/ 2013/11/there-is-no-thread.html – Evk

+0

*スレッドをまったく消費しません。 'await' *非同期操作が完了するのを待ってから、元のUIスレッドのような同じ実行コンテキストで続行します。 –

答えて

0

答えはいいえ、次のように読むことができます。

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より優れています。

+0

ありがとうLepijohnny、私は説明セクションで説明したように、私の質問は、Beginxxx、Endxxxパターンを使用するsocket.BeginReceive(..)、BeginSend(..)および他のすべてのドットネットAPIに関連しています。私の質問は、非同期/待機のシナリオ用ではありません。 – Shakeel

+0

@Shakeel実際には 'async/await'がルールであり例外ではありません。人々が「非同期API」について話すとき、タスクを返すそれらを意味します。 'Begin/End' APIは、過去4〜5年間、遺産とみなされています。 'async/await'を使ってソックス[実際に使用されている](http://stackoverflow.com/a/1388691/134204) –

+0

@Shakeelあなたが書いたことは[APMパターン](https://msdn.microsoft.com/en-us/library/ms228963(v = vs.110).aspx) –

0

複数の同時非同期呼び出しでは、ここで説明する複数のバックグラウンドスレッドは開かれません。blog.stephencleary.com/2013/11/there-is-no-thread.html

すべてのクレジットは、このリンクとリンクの元の著者を提案するために@Evkに行きます。

関連する問題