すでに2つの良い答えがありますが、0.02を追加するには...
非同期操作の使用について話している場合、 async
/await
は I/O バウンドと CPU バウンドの両方でうまく機能します。
MSDN のドキュメントは、非同期操作の生成に少し傾いていると思います。その場合TaskCompletionSource
、I/O バウンドおよびTask.Run
(または類似の) CPU バウンドに (または同様の) を使用する必要があります。Task
初期ラッパーを作成したら、およびで使用するのが最適です。async
await
あなたの特定の例では、実際にはどれくらいの時間LoadHtmlDocument
がかかるかにかかっています。を削除するとTask.Run
、呼び出したのと同じコンテキスト内で実行されますLoadPage
(おそらく UI スレッドで)。Windows 8 のガイドラインでは、50 ミリ秒を超える操作を行う必要があると指定されていasync
ます...開発者のマシンでの 50 ミリ秒は、クライアントのマシンでは長くなる可能性があることに注意してください...
したがってLoadHtmlDocument
、50 ミリ秒未満で実行されることが保証できる場合は、直接実行できます。
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
ただし、ConfigureAwait
@ svickが言及したように、私はお勧めします:
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
ではConfigureAwait
、HTTP 要求がすぐに (同期的に) 完了しない場合、(この場合)LoadHtmlDocument
への明示的な呼び出しなしでスレッド プール スレッドで実行されますTask.Run
。
async
このレベルのパフォーマンスに関心がある場合は、この件に関する Stephen Toub のビデオとMSDN の記事をご覧ください。彼は有益な情報をたくさん持っています。