当其中一个任务仍在运行时,Task.WaitAll不会抛出AggregateException

时间:2013-08-22 15:53:45

标签: c# task-parallel-library aggregateexception

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状态出现故障和异常信息。

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

1 个答案:

答案 0 :(得分:3)

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

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