【发布时间】:2013-02-01 02:24:37
【问题描述】:
我了解建议在库代码中将ConfigureAwait(false) 用于awaits,以便后续代码不会在调用者的执行上下文(可能是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
});
}
这两种方法有什么区别?
【问题讨论】:
标签: c# .net .net-4.5 async-await c#-5.0