後続のコードが呼び出し元の実行コンテキスト (UI スレッドである可能性がある) で実行されないように、ライブラリ コードでConfigureAwait(false)
for sを使用することが推奨されることを理解しています。同じ理由で、の代わりに使用する必要があることawait
も理解しています。await Task.Run(CpuBoundWork)
CpuBoundWork()
例ConfigureAwait
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var client = new HttpClient())
using (var httpResponse = await client.GetAsync(address).ConfigureAwait(false))
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync().ConfigureAwait(false))
return LoadHtmlDocument(contentStream); //CPU-bound
}
例Task.Run
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var client = new HttpClient())
using (var httpResponse = await client.GetAsync(address))
return await Task.Run(async () =>
{
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync())
return LoadHtmlDocument(contentStream); //CPU-bound
});
}
これら2つのアプローチの違いは何ですか?