运行多个异步任务并等待它们全部完成

2024-04-11

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

那里有很多文章,但我似乎越读越困惑。我已经阅读并理解了任务库的基本原理,但我显然在某处缺少链接。

我知道可以链接任务,以便它们在另一个任务完成后启动(这几乎是我读过的所有文章的场景),但我希望所有任务同时运行,并且我想知道一次他们都完成了。

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


两个答案都没有提到可等待的Task.WhenAll https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.7.1#System_Threading_Tasks_Task_WhenAll_System_Threading_Tasks_Task___:

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

await Task.WhenAll(task1, task2);

之间的主要区别Task.WaitAll https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitall?view=netframework-4.7.1#System_Threading_Tasks_Task_WaitAll_System_Threading_Tasks_Task___ and Task.WhenAll是前者会阻塞(类似于使用Wait在单个任务上),而后者不会并且可以等待,将控制权交还给调用者,直到所有任务完成。

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

Task.WaitAll:

至少一个任务实例被取消,或者至少一个任务实例执行期间抛出异常。如果任务被取消,AggregateException 的 InnerExceptions 集合中将包含一个 OperationCanceledException。

Task.WhenAll:

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

如果所提供的任务均未发生故障,但至少有一个任务被取消,则返回的任务将以“已取消”状态结束。

如果没有任务发生故障并且没有任务被取消,则生成的任务将以 RanToCompletion 状态结束。 如果提供的数组/枚举不包含任何任务,则返回的任务将立即转换为 RanToCompletion 状态,然后再返回给调用者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行多个异步任务并等待它们全部完成 的相关文章

随机推荐