我了解建议将 ConfigureAwait(false) 用于库代码中的 await s,以便后续代码不会在调用者的执行上下文中运行,这可能是一个 UI 线程。我也明白出于同样的原因,应该使用 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
        });
}

这两种方法有什么区别?

最佳答案

当你说 Task.Run 时,你是说你有一些 CPU 工作要做,这可能需要很长时间,所以它应该总是在线程池线程上运行。

当您说 ConfigureAwait(false) 时,您是说 async 方法的其余部分不需要原始上下文。 ConfigureAwait 更像是一个优化提示;它并不总是意味着延续在线程池线程上运行。

关于c# - 使用 ConfigureAwait(false) 和 Task.Run 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14906092/

10-13 08:09