Каковы различия между использованием ConfigureAwait (false) и Task.Run?

Я понимаю, что рекомендуется использовать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
        });
}

Каковы различия между этими двумя подходами?

Ответы на вопрос(4)

Ваш ответ на вопрос