Почему необработанное исключение в потоке таймера не приводит к сбою процесса - PullRequest
7 голосов
/ 23 февраля 2012

Мне известно о том, как обрабатываются неисчислимые исключения при использовании Task s, только выбрасывая необработанное в финализаторе, если пользовательский код его еще не «наблюдал».

Я также знаю, какнеобработанное исключение в асинхронном потоке (например, Action.BeginInvoke()) перехватывается и перебрасывается при присоединяющемся вызове (например, Action.EndInvoke()).

Хотя я не понимаю, как это не дает сбояпроцесс?

    static void Main(string[] args)
    {
        var timer = new System.Timers.Timer() {Interval = 100};
        timer.Elapsed += (o, e) => { throw new Exception(); };
        timer.Start();

        Console.ReadKey( true );
    }

1 Ответ

9 голосов
/ 23 февраля 2012

Из документации .NET 4.0:

В .NET Framework версии 2.0 и более ранних версиях компонент Timer перехватывает и подавляет все исключения, создаваемые обработчиками событий для события Elapsed.Это поведение может быть изменено в будущих выпусках .NET Framework.

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

Пока нет никаких утверждений о том, что это поведение действительно изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...