我需要在控制台应用程序中运行多个异步任务,并等待它们全部完成,然后再进一步处理.

外面有很多文章,但我似乎越读越困惑.我已经阅读并理解了任务库的基本原理,但我显然缺少了一个链接.

我知道可以将任务链接起来,这样它们可以在另一个任务完成后开始(这几乎是我读过的所有文章的场景),但我希望所有任务同时运行,我想知道它们是否都完成了.

对于这样的场景,最简单的实现是什么?

推荐答案

两个答案都没有提到值得期待的Task.WhenAll人:

var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();

await Task.WhenAll(task1, task2);

Task.WaitAllTask.WhenAll之间的主要区别在于前者会阻塞(类似于在单个任务中使用Wait),而后者不会也可以等待,在所有任务完成之前将控制权交还给调用者.

更重要的是,异常处理有所不同:

100:

至少有一个任务实例被取消,或者在至少一个任务实例的执行过程中引发了异常.如果任务已取消,则AggregateException在其InnerExceptions集合中包含OperationCanceledException.

100:

如果任何提供的任务在故障状态下完成,则返回的任务也将在故障状态下完成,其中其异常将包含来自每个提供的任务的未包装异常集合.

如果提供的任务都没有出现故障,但至少有一个已取消,则返回的任务将以取消状态结束.

如果没有任何任务出现故障,也没有任何任务被取消,则生成的任务将以RANTO完成状态结束.

.net相关问答推荐

使用.NET 8时无法识别运行标识符

在PowerShell中,XML子对象和属性是对象属性.它怎麽工作?

.NET MAUI 的登录页面

在 WP7 中将 List 转换为 ObservableCollection

在 C# 中将字符串转换为 colored颜色

整个命名空间的SuppressMessage

将 DataRowCollection 转换为 IEnumerable

在 C# 中将字节数组保存为磁盘上的文件的最有效方法是什么?

找不到 Microsoft.Office.Interop Visual Studio

什么决定了 Path.GetTempPath() 的返回值?

如何创建只读依赖属性?

如何判断对象是否是某种类型的数组?

如何使用反射在 .NET 中调用重载方法

基于多个字符分隔符拆分字符串

NuGetPackageImportStamp 有什么用?

.NET 反射的成本是多少?

设置 System.Drawing.Color 值

POCO 是什么意思?

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

我可以将构造函数参数传递给 Unity 的 Resolve() 方法吗?