Я изучаю async/await и после того, как прочитал эту статью Не блокировать код Async
и этот Является async/await подходящим для методов, которые связаны как с IO, так и с ЦП.
Я замечаю один совет из статьи @Stephen Cleary.
Использование ConfigureAwait (false) во избежание взаимоблокировок является опасной практикой. Вам нужно будет использовать ConfigureAwait (false) для каждого ожидания в транзитивном закрытии всех методов, вызываемых блоком блокировки, включая весь код третьей и второй сторон. Использование ConfigureAwait (false), чтобы избежать тупиковой ситуации, в лучшем случае - просто хак).
Он появился снова в коде сообщения, как я уже говорил выше.
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 (false), остальная часть метода async будет запущена в пуле потоков. Почему мы должны добавить его в каждую погоду в транзитивном закрытии? Я сам думаю, что это правильная версия, как я знал.
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()) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
Это означает, что второе использование ConfigureAwait (false) в использовании блока бесполезно. Пожалуйста, скажите мне правильный путь. Спасибо заранее.