2011-08-18 1 views
5

При ожидании задач с использованием Task.WaitAll и задании таймаута, если время ожидания WaitAll также необходимо отдельно наблюдать за любыми незавершенными задачами (например, путем регистрации продолжения)?Task and Task.WaitAll с обработкой исключений времени ожидания

This thread заставляет меня думать, что да, но я не нашел ничего, что подтверждает это.

var random = new Random(); 
var tasks = Enumerable.Range(0, 10).Select((i) => Task.Factory.StartNew(() => { 
     // Sleep 5-15 seconds 
     Thread.Sleep(random.Next(5000, 15000)); 
     throw new Exception("Some exception."); 
    } 
)).ToArray(); 

try { 
    // Wait for 10 seconds 
    Task.WaitAll(tasks, 10000); 
} catch (AggregateException) { 
    // Swallow 
} 

// Check to see how many tasks were unfinished 
tasks.Where(t => !t.IsCompleted).Count().Dump("Unfinished count: "); 

// Is this neccessary to avoid exceptions being thrown on the finalizer? 
foreach (Task task in tasks) { 
    task.ContinueWith(t => t.Exception, TaskContinuationOptions.OnlyOnFaulted); 
} 
+0

Сколько исключений присутствует в исключении AggregateException после WaitAll? –

+0

Полный простой источник lib здесь: http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by-a-taskscheduler-unobser –

ответ

0

Тестирование с LINQPad v4.31 указует ответ да, так как если вы закомментировать Еогеасп вы получите необработанный диалог исключения для каждой незавершенной задачи.

Полагаю, я понимаю, почему это на данный момент, но если кто-то хочет получить более техническое объяснение этого поведения, непременно пойдет на это.

2

Чтобы избежать сбоя финализатора, вы должны соблюдать исключения, сделанные корпусом Task. Для наблюдения Task исключения вы должны выполнить одно из следующих действий:

  1. доступа к свойству Exception
  2. вызова Task.Wait/WaitAll/WaitAny
  3. Зарегистрировать продолжение, которые выполняются только если задача нарушенных

То, что вы сделали, определенно необходимо, чтобы избежать сбоя финализатора.

Смежные вопросы