2017-04-05 19 views
0

.Net HttpClientasyncメソッドが新しいスレッドで実行されるのか、メインスレッドで実行されるのかは私は迷っています。HttpClient非同期メソッドが新しいスレッドで実行される

たとえば、私のコンソールアプリケーションでは、メソッドを呼び出して、HttpClient.GetStringAsyncメソッドを使用してURLコンテンツをダウンロードします。

このメソッド(GetStringAsync)は別の新しいスレッドで実行されますか?

+3

私はこの質問を読むことをお勧めします:http://stackoverflow.com/q/37419572/5311735そして最後に答えてください。簡単に言えば、ソースコードを検査せずに(またはドキュメントに記載されていない限り)正確に伝えることはできません。 – Evk

答えて

4

通常、非同期I/Oメソッドでは個別のスレッドは使用されません。私はこのブログの記事There Is No Threadで詳しく説明しています。

ただし、この特定のケースではですが、それは本当ではありません。 .NETのWebRequestベースのAPIは、非同期操作を長時間サポートしていましたが、実際には常にHTTPプロキシ検出とDNSルックアップをという同期として実行しています。これは、HttpClientが普及し始めたときに注目されました。残念ながら、マイクロソフトではではなく、でこれらの長年のバグを修正しています。

したがって、HttpClientは、そのWebRequest呼び出しをスレッドプールスレッドでラップします。 「非同期」APIを使用しているため、スレッドプールスレッドでは同期部分(HTTPプロキシとDNSルックアップ)のみが行われます。残りのリクエストは本当に非同期です。少なくとも、これはの一部のプラットフォームに当てはまります。

+0

私はこの例を見ていました。https://msdn.microsoft.com/en-ca/library/mt674882.aspx幸いにも、HttpClientの例がありました。このリンクでは、スレッドと呼ばれるセクションがあり、非同期待機コンテキスト内に余分なスレッドが作成されないことに言及しています。このセクションはこの例に関連していないと思いますか? – Mhd

+0

'asyncとawaitキーワードは追加のスレッドを作成しません.' - そのステートメントは完全に真です。 'async'も' await'も新しいスレッドを作成しません。 –

0

いいえ。async/awaitの使用は主に、IOバインドされたタスクを非同期で実行して新しいスレッドを作成しないために作成されるためです。 CPUに束縛されたタスクでのみ、新しいスレッドが作成されます。

+0

この声明の証拠のリンクはありますか? – cassandrad

+0

C#試験のプログラミングRef 70-483 – DigheadsFerke

+0

http://blog.stephencleary.com/2013/11/there-is-no-thread.html –

関連する問題