c# – Task.WaitAll和Exceptions

我有异常处理和并行任务的问题.

下面显示的代码启动2个任务并等待完成.我的问题是,如果一个任务引发一个异常,那么从来没有达到catch处理程序.

        List<Task> tasks = new List<Task>();
        try
        {                
            tasks.Add(Task.Factory.StartNew(TaskMethod1));
            tasks.Add(Task.Factory.StartNew(TaskMethod2));

            var arr = tasks.ToArray();                
            Task.WaitAll(arr);
        }
        catch (AggregateException e)
        {
            // do something
        }

但是当我使用以下代码来等待任务超时时,异常被捕获.

 while(!Task.WaitAll(arr,100));

我似乎缺少一些东西,因为WaitAll的文档描述了我的第一个尝试是正确的.请帮我理解为什么它不工作.

无法重现这一点 – 它对我来说很好:

using System;
using System.Threading;
using System.Threading.Tasks;

class Test
{
    static void Main()
    {
        Task t1 = Task.Factory.StartNew(() => Thread.Sleep(1000));
        Task t2 = Task.Factory.StartNew(() => {
            Thread.Sleep(500);
            throw new Exception("Oops");
        });

        try
        {
            Task.WaitAll(t1, t2);
            Console.WriteLine("All done");
        }
        catch (AggregateException)
        {
            Console.WriteLine("Something went wrong");
        }
    }
}

就像我所料到的那样打印出“出了问题”.

你的任务之一可能还没有完成吗? WaitAll真的等待所有的任务完成,即使有些已经失败了.

翻译自:https://stackoverflow.com/questions/4217643/task-waitall-and-exceptions

转载注明原文:c# – Task.WaitAll和Exceptions