Quais são as diferenças entre o uso de ConfigureAwait (false) e Task.Run?

Eu entendo que é recomendado usarConfigureAwait(false) paraawaits no código da biblioteca para que o código subsequente não seja executado no contexto de execução do responsável pela chamada, que poderia ser um encadeamento da interface do usuário. Eu também entendo queawait Task.Run(CpuBoundWork) deve ser usado em vez deCpuBoundWork() pela mesma razão.

Exemplo comConfigureAwait
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
}
Exemplo comTask.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
        });
}

Quais são as diferenças entre essas duas abordagens?

questionAnswers(4)

yourAnswerToTheQuestion