我有一个关于使用WhenAll() 时何时可以安全处理聚合异常的问题。看起来很自然的地方应该在 catch 块内,因为如果 catch 块永远不会触发,则意味着没有要处理的异常。但是我看到很多代码都有一个空的 catch 块,并在处理任何发现的异常(包括在 MS 网站上)之前检查是否存在 AggregateException。
public async Task MyMethod() {
var tasks = new List<Task>();
for (var i = 0; i < 10; i++) {
tasks.Add(DoSthAsync());
}
var masterTask = Task.WhenAll(tasks);
try {
var results = await masterTask;
} catch {
// Safe to access masterTask here and handle aggregate exceptions? Have all tasks completed?
foreach (var ex in masterTask.Exception.innerExceptions) {
HandleException(ex);
}
}
// Or necessary to check for and handle aggregate exceptions here?
if (masterTask.Exception != null) {
foreach (var ex in masterTask.Exception.innerExceptions) {
HandleException(ex);
}
}
}
public async Task DoSthAsync() {
// ...
}