Task.WaitAll не генерирует 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 и может видеть ArgumentException, выданный Task2.

  3. Task1 не закончил вовремя и все еще работает. Task2 выдает ошибку. Задача 3 выполнена. → AggregateException не сработало. Я вижу, что состояние Task2 является ошибочным и информация об исключении в свойстве Exception.

Я не знаю, почему в сценарии № 3 не генерируется AggregateException. Любая помощь?

1 ответ

Это ожидаемое поведение. Если вы истечете время ожидания до того, как все задачи будут выполнены (либо завершены, либо сбиты, либо отменены), оно не сгенерирует исключение: оно просто вернет false.

Он выдаст исключение только в том случае, если все задачи были выполнены в отведенное время.

Другие вопросы по тегам