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

StackOverflow https://stackoverflow.com/questions/2655809

Вопрос

Я смотрю на пример обработки исключений 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();
}

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

Разве это не должно быть написано так:

try
{
   Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top