所以我有一种将任务链接在一起以完成工作的方法
var tasks = new List<Task>();
tasks.Add(DoWorkAsync(1));
tasks.Add(DoWorkAsync(2));
tasks.Add(DoWorkAsync(3));
tasks.Add(DoWorkAsync(4));
tasks.Add(DoWorkAsync(5));
tasks.Add(DoWorkAsync(6));
await Task.WhenAll(tasks.ToArray());
为了从这种方法中获得更好的性能/响应能力,我一直在考虑使用ConfigureAwait(false)
上面的方法不需要在与调用线程相同的同步上下文中运行。
在链接ConfigueAwait(false)
时使用Tasks
的正确方法是什么,我是否需要对每个任务使用ConfigureAwait
和/或我是否需要在{{1 }}
还有一个问题...
如果在等待之后没有代码可以运行,Task.WhenAll
会做任何事情(或提高性能/响应能力)吗?
答案 0 :(得分:2)
好吧,从评论和将其他几个问题联系在一起,我想我对何时使用configure await有更好的了解...
以下所有建议均假定您的任务不需要返回到调用线程。也就是说,您有一个有效的ConfigureAwait
用例
ConfigureAwait配置等待,而不配置任务-您只需要在使用ConfigureAwait
的行上使用await
根据以下答案:Using ConfigureAwait(false) on tasks passed in to Task.WhenAll() fails
即使它是方法的最后一行,您也需要使用ConfigureAwait
来自此答案:Does Task.ConfigureAwait(false) on the last method line affect anything?
ConfigureAwait
时无需调用 ContinueWith
Task.WhenAll
中包含的任务已使用ConfigureAwait
也是从这个答案:Using ConfigureAwait(false) on tasks passed in to Task.WhenAll() fails
这让我的代码看起来像这样:
var tasks = new List<Task>();
tasks.Add(DoWorkAsync(1));
tasks.Add(DoWorkAsync(2));
tasks.Add(DoWorkAsync(3));
tasks.Add(DoWorkAsync(4));
tasks.Add(DoWorkAsync(5));
tasks.Add(DoWorkAsync(6));
await Task.WhenAll(tasks.ToArray()).ConfigureAwait(false);
令我惊讶的是,大多数社区似乎建议使用ConfigureAwait
,尽管在谈论Threading / async / await时并没有真正提及。
其他信息: Why would I bother to use Task.ConfigureAwait(continueOnCapturedContext: false);
我不是该领域的专家,我只是将其他问题联系在一起,因此,如果我错过了任何事情/遇到了什么错误,请随时加入。