Библиотека параллельных задач - исключение не обрабатывается?

Привет, у меня есть следующий код:

    try
    {
        var t1 = Task.Factory.StartNew(() =>
        {
            Count(5, 10);
        });
        //t1.Wait(); //This line if uncommented causes the exception to be handled below....
        Console.WriteLine("done");
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(ex);
    }

    private void Count(int start, int end)
    {
        for (var i = start; i <= end; i++)
        {
            Console.WriteLine(i);
            if (i == 7) throw new InvalidOperationException("Something bad happened");
            Thread.Sleep(1000);
        }
    }

Если я не хочу ждать своей задачи, но все же хочу обрабатывать исключения, как я могу этого добиться?


person Ilyas    schedule 10.08.2012    source источник


Ответы (2)


Создайте продолжение, которое обрабатывает ошибки при сбое задачи:

var t1 = Task.Factory.StartNew(() =>
    {
        Count(5, 10);
    });
t1.ContinueWith(
    (task) =>
    {
        var error = task.Exception;
        // handle error
    }, TaskContinuationOptions.OnlyOnFaulted);

OnlyOnFaulted указывает, что продолжение будет выполняться в потоке пула потоков в случае сбоя задачи. Если задача завершается успешно, она не будет выполняться.

person Sean U    schedule 10.08.2012

Стек, который создал и запустил задачи, может больше не существовать... как можно ожидать, что он будет обрабатывать исключения?

Вы могли:

  1. поместите обработку исключений в верхнюю часть стека каждой задачи.
  2. создать задачу для создания/запуска/ожидания/обработки исключений дочерних задач
  3. создайте задачу продолжения для обработки исключения (как в ответе Шона У).
person Amy B    schedule 10.08.2012