假设你的 3 个方法返回Task<int>
您可以保留最初的解决方案以供使用Task.WhenAll
like:
int[] results = await Task.WhenAll(
DailyAgeAnalysesTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate),
DailyBalanceTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate),
DailyInventoryTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate)
);
With Task.WhenAll
,您一定要等待所有任务完成,即使有一个任务抛出异常。因此,您可以使用单个 try/catch 块。如果多个任务失败,AggregateException
被提出。
与连续3次不一样await
。使用连续等待,如果第一个任务失败,则不会等待后续任务,并且不会观察到它们的异常。即使您捕获了第一个异常,稍后也可能会引发其他异常并使您的程序崩溃。您将需要 3 个不同的 try/catch 块。
注意:现在未观察到的异常不会使您的程序崩溃,阅读以获取更多信息 https://devblogs.microsoft.com/pfxteam/task-exception-handling-in-net-4-5/在代码示例之后有 2 个连续的等待。解释得很好。
为了让开发者更方便的编写基于的异步代码
任务,.NET 4.5 更改了未观察到的默认异常行为
例外情况。虽然未观察到的异常仍会导致
要引发 UnobservedTaskException 事件(不这样做将是
重大更改),默认情况下该进程不会崩溃。
[...]
请注意,此更改并不意味着开发人员应该粗心
忽略未处理的异常......这只是意味着运行时间有点长
比以前更加宽容。