我需要在控制台应用程序中运行多个异步任务,并等待它们全部完成,然后再进一步处理.
外面有很多文章,但我似乎越读越困惑.我已经阅读并理解了任务库的基本原理,但我显然缺少了一个链接.
我知道可以将任务链接起来,这样它们可以在另一个任务完成后开始(这几乎是我读过的所有文章的场景),但我希望所有任务同时运行,我想知道它们是否都完成了.
对于这样的场景,最简单的实现是什么?
我需要在控制台应用程序中运行多个异步任务,并等待它们全部完成,然后再进一步处理.
外面有很多文章,但我似乎越读越困惑.我已经阅读并理解了任务库的基本原理,但我显然缺少了一个链接.
我知道可以将任务链接起来,这样它们可以在另一个任务完成后开始(这几乎是我读过的所有文章的场景),但我希望所有任务同时运行,我想知道它们是否都完成了.
对于这样的场景,最简单的实现是什么?
两个答案都没有提到值得期待的Task.WhenAll
人:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
Task.WaitAll
和Task.WhenAll
之间的主要区别在于前者会阻塞(类似于在单个任务中使用Wait
),而后者不会也可以等待,在所有任务完成之前将控制权交还给调用者.
更重要的是,异常处理有所不同:
100:
至少有一个任务实例被取消,或者在至少一个任务实例的执行过程中引发了异常.如果任务已取消,则AggregateException在其InnerExceptions集合中包含OperationCanceledException.
100:
如果任何提供的任务在故障状态下完成,则返回的任务也将在故障状态下完成,其中其异常将包含来自每个提供的任务的未包装异常集合.
如果提供的任务都没有出现故障,但至少有一个已取消,则返回的任务将以取消状态结束.
如果没有任何任务出现故障,也没有任何任务被取消,则生成的任务将以RANTO完成状态结束.