【发布时间】:2018-10-19 14:00:47
【问题描述】:
我试图弄清楚如何正确处理一个“坏”Task 引发的异常,当在 throttling pattern 和 WhenAny 中实现多个任务时。
不幸的是,我不断收到所有“好”任务引发的异常,该异常在一个“坏”任务引发异常后完成。
我已尝试添加 ContinueWith 以尝试让剩余的“好”任务返回正确的值。然而,即便如此,“好”任务仍然坚持仍然抛出异常。
如何编写代码以确保处理一个“坏”任务的异常,同时从其他“好”任务中获取正确的值?
这里有一个简化的例子来演示这个问题。
这会模拟抛出异常或返回良好结果的代码。在这种情况下,只有当输入是 int 2 时才会抛出异常:
static class Bar {
public static string MightThrowException(int i) {
if (i == 2) throw new Exception("bad error: " + i.ToString());
// if not 2, just return input
return i.ToString();
}
}
...这是应该为该实例处理异常的代码:
public async Task<string> TestThrottle() {
var tasks = new List<Task<string>>();
var results = new List<string>();
// mock the 'priming' that occurs in a throttling pattern
tasks.Add(Task.Run(() => Bar.MightThrowException(0)));
// begin throttling, for an additional 4 tasks
for (var i = 1; i < 5; i++) {
try {
var task = await Task.WhenAny(tasks);
results.Add(task.Result);
tasks.Remove(task);
}
catch (Exception ex) {
results.Add("handled " + ex.Message);
}
tasks.Add(Task.Run(() => Bar.MightThrowException(i)));
}
return string.Join("\n", results);
}
整个事情都是以这种方式在 Main() 中触发的:
Task.Run(() => {
string result = new Foo().TestThrottle().Result;
System.Diagnostics.Debug.WriteLine(result);
}).Wait();
【问题讨论】:
-
仅供参考,这是针对 .NET 4.6.2 的。同样,当我在
catch中处理AggregateException的InnerExceptions并输出内部异常消息时,它会验证异常'bad error: 2' 被多次捕获。
标签: c#