Я понимаю, что он рекомендовал использовать ConfigureAwait(false)
для 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
});
}
Каковы различия между этими двумя подходами?