Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我在异步应用程序中没有捕获异常?_C#_.net_Task Parallel Library - Fatal编程技术网

C# 为什么我在异步应用程序中没有捕获异常?

C# 为什么我在异步应用程序中没有捕获异常?,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我已经阅读了一些内容,比如here(),我认为async Task方法的行为是: 当使用Wait或Task.Wait时,您可以正常尝试/捕获它们,例如try{Wait X();}catch(异常SqlException e){…} 如果让它“冒泡”,您将得到aggregateeexception 但我发现我的应用程序只是终止,根本没有中断异常。我的代码如下所示: internal async Task RunAsync() { var tasks = monito

我已经阅读了一些内容,比如here(),我认为
async Task
方法的行为是:

  • 当使用
    Wait
    Task.Wait
    时,您可以正常尝试/捕获它们,例如
    try{Wait X();}catch(异常SqlException e){…}
  • 如果让它“冒泡”,您将得到
    aggregateeexception
  • 但我发现我的应用程序只是终止,根本没有中断异常。我的代码如下所示:

        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);
            }
        }
    
    在“1”和“2”上设置断点,我可以看到
    任务
    至少有一个
    任务
    状态为故障,
    t
    状态为RANTO完成。因此,故障状态丢失,没有异常

    很明显,我遗漏了一些明显的东西,我应该做些什么不同的事情


    顺便说一句,当使用任何来检测异常终止时,这些任务只应在出现故障时退出。这更像是一个了解捕获异常的测试平台。

    这是因为
    WhenAny
    。请检查:

    返回的任务将在提供的任何任务完成后完成 完整的。返回的任务将始终以RANTO完成结束 将结果集设置为要完成的第一个任务的状态这是真的 即使要完成的第一个任务以“已取消”或“出现故障”结束 状态。 (强调矿山)

    这意味着当任何任务出现故障时,
    wheny
    都不会引发异常


    这与
    WhenAll
    相反,WhenAll会在它等待出现故障的任何任务出现未处理的异常时引发异常。

    这是因为
    whenay
    。请检查:

    返回的任务将在提供的任何任务完成后完成 完整的。返回的任务将始终以RANTO完成结束 将结果集设置为要完成的第一个任务的状态这是真的 即使要完成的第一个任务以“已取消”或“出现故障”结束 状态。 (强调矿山)

    这意味着当任何任务出现故障时,
    wheny
    都不会引发异常


    这与whalll相反,whalll会在它等待的任何任务出现故障时引发异常,并且出现未经处理的异常。

    谢谢,仔细想想,这是有道理的。。。当一个任务失败时,任何一个任务正常完成时,所有任务都异常完成。那么,您的建议是我应该简单地使用
    whalll
    ,还是有其他好的选择?
    WhenAny
    是好的,当您只想在任何任务以某种方式运行到完成时继续。如果您想检查任何任务是否失败,那么您应该使用
    whalll
    ,这是正确的做法。谢谢,当您考虑它时,这是有意义的。。。当一个任务失败时,任何一个任务正常完成时,所有任务都异常完成。那么,您的建议是我应该简单地使用
    whalll
    ,还是有其他好的选择?
    WhenAny
    是好的,当您只想在任何任务以某种方式运行到完成时继续。如果要检查任何任务是否失败,则应使用
    whalll
    ,这是正确的做法。