Sam*_*Sam 55 .net c# async-await c#-5.0 .net-4.5
据我所知,它是推荐使用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
}
Run Code Online (Sandbox Code Playgroud)
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
});
}
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么不同?
Ste*_*ary 69
当你说Task.Run
,你说你有一些CPU工作可能需要很长时间,所以它应该始终在线程池线程上运行.
当你说ConfigureAwait(false)
,你说的是该async
方法的其余部分不需要原始上下文.ConfigureAwait
更多的是优化提示; 它并不总是意味着继续在线程池线程上运行.
Ree*_*sey 16
在这种情况下,您的Task.Run
版本将有更多的开销,因为第一个await call(await client.GetAsync(address)
)仍将封送回调用上下文,调用的结果也是如此Task.Run
.
另一方面,在第一个示例中,您的第一个Async()
方法被配置为不需要编组回调用上下文,这允许继续在后台线程上运行.因此,不会有任何编组回到调用者的上下文中.
归档时间: |
|
查看次数: |
31794 次 |
最近记录: |