Task.WaitAll 不会在其中一个任务仍在运行时引发 AggregateException

本文关键字:任务 运行时 AggregateException 一个 WaitAll 在其中 Task | 更新日期: 2023-09-27 18:28:35

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;
}

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

  1. 所有任务都按时完成。 → 工作正常。

  2. Task2 抛出错误,所有其他任务及时完成。 → 捕获了 AggregateException,可以看到 Task2 抛出的 ArgumentException。

  3. 任务 1 未及时完成,仍在运行。任务 2 引发错误。 任务 3 已完成。 → AggregateException 没有触发。 我看到 Task2 状态出现故障,异常属性中存在异常信息。

我不知道为什么它没有在场景 #3 中抛出聚合异常。 有什么帮助吗?

Task.WaitAll 不会在其中一个任务仍在运行时引发 AggregateException

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

它只会在所有任务在分配的时间内完成的情况下引发异常。