c# - 为什么我应该更喜欢单个 'await Task.WhenAll' 而不是多个等待?

标签 c# .net parallel-processing task-parallel-library async-await

如果我不关心任务完成的顺序,只需要它们全部完成,我是否仍应使用 await Task.WhenAll 而不是多个 await?例如,DoWork2 是否低于 DoWork1 的首选方法(为什么?):

using System;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task<string> DoTaskAsync(string name, int timeout)
        {
            var start = DateTime.Now;
            Console.WriteLine("Enter {0}, {1}", name, timeout);
            await Task.Delay(timeout);
            Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds);
            return name;
        }

        static async Task DoWork1()
        {
            var t1 = DoTaskAsync("t1.1", 3000);
            var t2 = DoTaskAsync("t1.2", 2000);
            var t3 = DoTaskAsync("t1.3", 1000);

            await t1; await t2; await t3;

            Console.WriteLine("DoWork1 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
        }

        static async Task DoWork2()
        {
            var t1 = DoTaskAsync("t2.1", 3000);
            var t2 = DoTaskAsync("t2.2", 2000);
            var t3 = DoTaskAsync("t2.3", 1000);

            await Task.WhenAll(t1, t2, t3);

            Console.WriteLine("DoWork2 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
        }


        static void Main(string[] args)
        {
            Task.WhenAll(DoWork1(), DoWork2()).Wait();
        }
    }
}

最佳答案

是的,使用 WhenAll 因为它会立即传播所有错误。使用多个等待,如果较早的等待之一抛出,您将丢失错误。

另一个重要区别是 WhenAll 将等待所有任务完成,即使出现故障(出现故障或取消的任务)。手动按顺序等待会导致意外的并发,因为程序中想要等待的部分实际上会提前继续。

我认为这也让阅读代码变得更容易,因为您想要的语义直接记录在代码中。

关于c# - 为什么我应该更喜欢单个 'await Task.WhenAll' 而不是多个等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310996/

相关文章:

c++ - RcppParallel 中如何调用自定义函数?

c# - WebForms ASCX 中的 Linq Lambda 支持

c# - 更改结构的大小是 C# 中的重大更改吗?

c# - 从存储过程返回值作为输出参数与 SELECT 语句

c# - 为什么在 WCF 应用程序的 Web.config 文件中添加 httpRuntime targetFramework 可以解决与 TLS 相关的连接问题?

scheduling - GNU make中的互斥作业调度?

C# 单元测试在 Azure DevOps 中运行,但不在 Visual Studio 中运行

c# - 在 Windows 中将我的 C# Windows 应用程序添加为打印机

.net - 如何在 BindingSource.Filter 之后获取 DataGridView 的可见行数?

multithreading - 如何在 4 核 CPU : 4 threads or 50 threads? 上更快地进行相同的计算