为什么我在异步应用程序中没有捕捉到异常?[重复]

问题描述 投票:0回答:1

我看了一下,比如这里(捕获一个异步void方法抛出的异常。)的行为,而我认为 async Task 方法是。

  1. 你可以像使用普通的方法一样去抓他们。awaitTask.Wait 例如 try{ await X();}catch(Exception SqlException e){...}
  2. 如果你让它 "冒泡",你会得到的是 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 是用来检测异常终止的,这些任务应该只因失败而退出。这更像是一个测试平台,用来理解捕获异常。

c# .net task-parallel-library
1个回答
2
投票

这是因为 WhenAny. 请检查 文件:

当任何一个任务完成后,返回的任务将完成。返回的任务将始终以RanToCompletion状态结束,其Result设置为第一个完成的任务。即使第一个完成的任务以Canceled或Faulted状态结束,也是如此。. (重点是我)

这意味着 WhenAny 不会在任何一个任务发生故障时引发异常。

这与 WhenAll,如果它所等待的任何一个任务出现了未处理的异常,它将引发一个异常。

© www.soinside.com 2019 - 2024. All rights reserved.