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

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

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

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

推荐答案

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

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

await Task.WhenAll(task1, task2);

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

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

100:

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

100:

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

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

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

.net相关问答推荐

为什么Linq中的运算符逻辑不匹配结果,当值为0或在VB. NET中没有

.NET restore/build在使用组织包的Github Action工作流中调用时获得401

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

为什么这个同步运行的异步睡眠会挂起?

仅在有换行符时捕获分隔符之间的所有文本

如何将 Javascript 日期时间转换为 C# 日期时间?

如何使用 C# 关键字作为属性名称?

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

Linq查询分组并 Select 第一个项目

图像与位图类

大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败

向 .NET 应用程序添加脚本功能

将 StreamReader 返回到开头

ReaderWriterLockSlim 什么时候比简单的锁更好?

C# (.NET) 设计缺陷

如何使用 NPOI 读取文件

如何从 HashSet 中检索实际项目?

使用 C# vs F# 或 F# vs C# 有什么好处?

在 C# 中转义无效的 XML 字符

检测到包降级警告(dotnet core,vs 2017)