MSDN Пример обращения с исключением из TPL - это состояние гонки?
-
27-09-2019 - |
Вопрос
Я смотрю на пример обработки исключений 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 () является исключением, которое проторино для объединения нити. По сути, исключение «хранится» до тех пор, пока он не может быть пропорочен обратно в резьбу, которая ждет обратной связи.
Не связан с StackOverflow