【发布时间】:2012-09-22 13:57:54
【问题描述】:
假设我有三个任务,a、b 和 c。这三个都保证在 1 到 5 秒之间的随机时间抛出异常。然后我编写以下代码:
await Task.WhenAny(a, b, c);
这最终会从首先出错的任务中抛出异常。因为这里没有try...catch,所以这个异常会冒泡到我的代码中的其他地方。
当剩下的两个任务抛出异常时会发生什么?这些未观察到的异常,不就是会导致整个进程被杀死吗?这是否意味着使用WhenAny 的唯一方法是在try...catch 块内,然后在继续之前以某种方式观察剩余的两个任务?
跟进:我希望答案适用于带有异步目标包的 .NET 4.5 和 .NET 4.0(尽管显然使用 TaskEx.WhenAny在那种情况下)。
【问题讨论】:
-
你尝试运行代码看看会发生什么吗?
-
@Servy 终结器没有抛出,但我看不出一个很好的理由。
-
我想你的意思是
Task.WhenAny(),await Task.WaitAny()甚至不会编译。 -
这里有个错误的前提:
Task.WhenAny和Task.WaitAny永远不会抛出异常。 -
@DavidPfeffer 我不这么认为。等待从
WhenAny返回的任务不会抛出。它返回导致 WhenAny 运行完成的任务,等待 that 任务将抛出。
标签: c# .net task-parallel-library .net-4.5 async-await