2016-04-13 4 views
-1

Этот код:Понимание исключений внутри Task.Run()

class Program 
{ 
    static void Main(string[] args) 
    { 
     Task.Run(() => 
     { 
      throw new Exception(); 
     }).Wait(); 
    } 
} 

путает меня. Запустите его, и отладчик разбивается на throw, как я ожидал. Хит f5 и хлеб отладчика на Task.Run с AggregateException, как я ожидал.

Хит f5 снова, и отладчик снова разрывается на throw, затем на Run повторите.

Что здесь происходит? Я бы ожидал два перерыва, а затем программу для выхода. Либо мой отладчик попал в лужу/у меня не было достаточно кофе еще, или, казалось бы, Task.Run является повторная попытка делегат ...

+2

Нажмите F5 и снова запустите программу? Просто гадать ... –

+0

'Wait 'синхронно, то есть блокируется до завершения задачи. –

+0

Программа @StefanSteinegger не перезапускается. добавьте точки останова в 'throw', и код многократно запускается –

ответ

3

Вы можете увидеть точно такое же поведение, если не используется задачи:

class Program 
{ 
    static void Main(string[] args) 
    { 
     throw new Exception(); 
    } 
} 

Поскольку существует необработанное исключение, отладчик не будет продолжать (поскольку процесс завершится сбой).

+2

Вы можете остановить это поведение, сняв флажок «Развернуть стек вызовов на необработанных исключениях» в «Инструменты-> Параметры->« Отладка-> Общие »в VS – Fratyx

+0

@Fratyx, так что это причуда Visual Studio/debugger, а не то, что произойдет, когда не отладка ? –

+0

@AndrewBullock: это действительно так. Чтобы отключить поведение, используйте параметр Fratyx. (Отлаженный процесс выйдет после исключения) –

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