我看了一下,比如这里(捕获一个异步void方法抛出的异常。)的行为,而我认为 async Task
方法是。
await
或 Task.Wait
例如 try{ await X();}catch(Exception SqlException e){...}
AggregateException
但我发现我的应用程序只是终止,根本没有中断异常。我的代码看起来是这样的:"ONE "和 "TWO "上设置断点,我可以看到
internal async Task RunAsync()
{
var tasks = monitors.Select((p) => p.Value.MonitorAsync()).ToList();
await Task.WhenAny(tasks);
Console.WriteLine("ONE");
}
public static async Task Main(string[] args)
{
var app = new App();
try
{
await app.RunAsync();
Console.WriteLine("TWO");
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
在 "ONE "和 "TWO "上设置断点,我可以看到: tasks
至少有一个 Task
状态为 "故障",以及 t
具有状态RanToCompletion。所以故障状态丢失,没有异常。
显然我漏掉了一些明显的东西,我应该做什么不同的事情?
另外 WhenAny
是用来检测异常终止的,这些任务应该只因失败而退出。这更像是一个测试平台,用来理解捕获异常。
这是因为 WhenAny
. 请检查 文件:
当任何一个任务完成后,返回的任务将完成。返回的任务将始终以RanToCompletion状态结束,其Result设置为第一个完成的任务。即使第一个完成的任务以Canceled或Faulted状态结束,也是如此。. (重点是我)
这意味着 WhenAny
不会在任何一个任务发生故障时引发异常。
这与 WhenAll
,如果它所等待的任何一个任务出现了未处理的异常,它将引发一个异常。