Was sind die Unterschiede zwischen ConfigureAwait (false) und Task.Run?

Ich verstehe, dass es empfohlen wird, zu verwendenConfigureAwait(false) zumawaits im Bibliothekscode, sodass nachfolgender Code nicht im Ausführungskontext des Aufrufers ausgeführt wird, der möglicherweise ein UI-Thread ist. Das verstehe ich auchawait Task.Run(CpuBoundWork) sollte anstelle von verwendet werdenCpuBoundWork() aus dem gleichen Grunde.

Beispiel mitConfigureAwait
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
}
Beispiel mitTask.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
        });
}

Was sind die Unterschiede zwischen diesen beiden Ansätzen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage