Пример MSDN обработки исключения из TPL. Является ли это состоянием гонки?

Я смотрю на пример обработки исключений TPL из MSDN @

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

Основная форма кода:

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
try
{
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}

Мой вопрос: это состояние гонки? Что произойдет, если задача 1 сработает до того, как попытка будет выполнена? Я пропустил что-то, что мешает этой гонке?

Не следует ли вместо этого написать так:

try
{
   Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}

person David    schedule 16.04.2010    source источник


Ответы (1)


Нет, первый пример вполне верный.

Когда исключение возникает в задаче, оно оборачивается в AggregateException. Только когда к задаче присоединяется другой поток, в этом примере при вызове task1.Wait() исключение распространяется на присоединяющийся поток. По сути, исключение «сохраняется» до тех пор, пока оно не может быть передано обратно в поток, ожидающий обратной связи.

person Chris Taylor    schedule 16.04.2010