C# Task.WaitAll在其中一个任务仍在运行时未引发AggregateException var moduleTimeOut=3000; var errorsthatOccessed=新列表(); 列表名称=新列表(){“Task1”、“Task2”、“Task3”}; var tasks=新列表(); name.ForEach(name=>tasks.Add(Task.Factory.StartNew((m)=>MyTask(m.ToString()),name)); 尝试 { var allTasksCompletedInTime=Task.WaitAll(tasks.ToArray(),moduleTimeOut); } 捕获(聚合异常) { foreach(ex中的var异常) { 出现错误。添加(异常。ToString()); } } 私有字符串MyTask(字符串名称) { 如果(名称等于(“任务1”)) 系统线程线程睡眠(5000); 如果(名称等于(“任务2”)) 抛出新ArgumentException(“Task2已抛出异常”); return“MyTask已执行完毕,任务为”+名称; }

C# Task.WaitAll在其中一个任务仍在运行时未引发AggregateException var moduleTimeOut=3000; var errorsthatOccessed=新列表(); 列表名称=新列表(){“Task1”、“Task2”、“Task3”}; var tasks=新列表(); name.ForEach(name=>tasks.Add(Task.Factory.StartNew((m)=>MyTask(m.ToString()),name)); 尝试 { var allTasksCompletedInTime=Task.WaitAll(tasks.ToArray(),moduleTimeOut); } 捕获(聚合异常) { foreach(ex中的var异常) { 出现错误。添加(异常。ToString()); } } 私有字符串MyTask(字符串名称) { 如果(名称等于(“任务1”)) 系统线程线程睡眠(5000); 如果(名称等于(“任务2”)) 抛出新ArgumentException(“Task2已抛出异常”); return“MyTask已执行完毕,任务为”+名称; },c#,task-parallel-library,aggregateexception,C#,Task Parallel Library,Aggregateexception,我在捕获聚合异常时遇到一些问题。以下是我的不同场景 所有任务都按时完成。→ 很好 Task2会抛出一个错误,所有其他任务都会及时完成。→ 捕获了AggregateException,可以看到Task2引发的ArgumentException 任务1未及时完成,仍在运行。Task2抛出一个错误。任务3已完成。→ AggregateException没有触发。我在exception属性中看到Task2状态为faulted和异常信息 我不知道为什么它不在场景3中抛出AggregateExceptio

我在捕获聚合异常时遇到一些问题。以下是我的不同场景

  • 所有任务都按时完成。→ 很好

  • Task2会抛出一个错误,所有其他任务都会及时完成。→ 捕获了AggregateException,可以看到Task2引发的ArgumentException

  • 任务1未及时完成,仍在运行。Task2抛出一个错误。任务3已完成。→ AggregateException没有触发。我在exception属性中看到Task2状态为faulted和异常信息


  • 我不知道为什么它不在场景3中抛出AggregateException。有什么帮助吗

    这是预期的行为。如果在所有任务完成之前(运行到完成、出错或取消)达到超时,它不会抛出异常:只会返回false


    只有当所有任务都在分配的时间内完成时,它才会抛出异常。

    这是预期的行为。如果在所有任务完成之前(运行到完成、出错或取消)达到超时,它不会抛出异常:只会返回false


    只有当所有任务都在分配的时间内完成时,才会抛出异常。

    谢谢!那么,在这种情况下,我应该如何捕获所有异常?我无法等待所有任务完成以捕获所有异常。@user1186065您需要查看传递给
    WaitAll
    的每个任务的状态,并跟踪出现故障的任务。或者,您可以创建自己版本的
    WaitAll
    ,该版本具有您想要的行为,您可以使用它。谢谢!那么,在这种情况下,我应该如何捕获所有异常?我无法等待所有任务完成以捕获所有异常。@user1186065您需要查看传递给
    WaitAll
    的每个任务的状态,并跟踪出现故障的任务。或者,您也可以创建自己版本的
    WaitAll
    ,该版本具有您想要的行为,您可以使用它。
    var moduleTimeOut = 3000;
    var errorsThatOccurred = new List<string>();
    List<string> names = new List<string>() { "Task1", "Task2", "Task3" };
    
    var tasks = new List<Task<string>>();
    names.ForEach( name => tasks.Add( Task<string>.Factory.StartNew((m) => MyTask(m.ToString()), name)));
    
    try
    {
        var allTasksCompletedInTime = Task.WaitAll(tasks.ToArray(), moduleTimeOut);
    
    }
    catch (AggregateException ex)
    {
        foreach (var exception in ex)
        {
            errorsThatOccurred.Add(exception.ToString());
        }
    }
    private string MyTask(string name)
    {
        if (name.Equals("Task1"))
            System.Threading.Thread.Sleep(5000);
    
        if (name.Equals("Task2"))
            throw new ArgumentException("Task2 has thrown an exception");
    
        return "MyTask has finished the execution. Task is " + name;
    }