【问题标题】:Task.WaitAll not throwing AggregateException while one of the task is still runningTask.WaitAll 在其中一项任务仍在运行时不抛出 AggregateException
【发布时间】:2013-08-23 02:09:42
【问题描述】:
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;
}

我在捕获 AggregateException 时遇到了一些问题。这是我的不同场景。

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

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

  3. Task1 未按时完成且仍在运行。 Task2 抛出错误。任务 3 完成。 → AggregateException 没有触发。我在 Exception 属性中看到 Task2 状态为故障和异常信息。

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

【问题讨论】:

    标签: c# task-parallel-library aggregateexception


    【解决方案1】:

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

    只有在规定时间内所有任务都完成的情况下才会抛出异常。

    【讨论】:

    • 谢谢!那么在这种情况下我应该如何捕获所有异常呢?我迫不及待地等待所有任务完成以捕获所有异常。
    • @user1186065 您需要查看您传递给WaitAll 的每个任务的状态,并跟踪那些出错的任务。或者,您可以创建自己的 WaitAll 版本,并使用您想要的行为来代替。
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2019-06-29
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多