链接任务时正确使用ConfigureAwait(false)

时间:2019-07-03 13:15:06

标签: c# asynchronous task

所以我有一种将任务链接在一起以完成工作的方法

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会做任何事情(或提高性能/响应能力)吗?

1 个答案:

答案 0 :(得分:2)

好吧,从评论和将其他几个问题联系在一起,我想我对何时使用configure await有更好的了解...

以下所有建议均假定您的任务不需要返回到调用线程。也就是说,您有一个有效的ConfigureAwait用例

  1. ConfigureAwait配置等待,而不配置任务-您只需要在使用ConfigureAwait的行上使用await

    根据以下答案:Using ConfigureAwait(false) on tasks passed in to Task.WhenAll() fails

  2. 即使它是方法的最后一行,您也需要使用ConfigureAwait

    来自此答案:Does Task.ConfigureAwait(false) on the last method line affect anything?

  3. 使用ConfigureAwait

    时无需调用
  4. ContinueWith

    从此答案开始:ConfigureAwait(false) when using ContinueWith

  5. 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);

我不是该领域的专家,我只是将其他问题联系在一起,因此,如果我错过了任何事情/遇到了什么错误,请随时加入。