2010-04-16 8 views
4

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

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(); 
} 

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

Не должно быть написано, как это вместо:

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

ответ

6

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

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

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