7

Jestem świadomy, jak przetwarzane są nieobsługiwane wyjątki podczas korzystania z Task s, tylko wyrzucam nieobsługiwane do finalizatora, jeśli kod użytkownika jeszcze go nie "zaobserwował".Dlaczego nieobsługiwany wyjątek w wątku z zegarem nie powoduje awarii procesu?

Mam również świadomość, że nieobsługiwany wyjątek w wątku asynchronicznym (np. Action.BeginInvoke()) jest przechwytywany i ponownie zgłaszany podczas połączenia (na przykład Action.EndInvoke()).

Czego jednak nie rozumiem, to jak to się nie załamuje?

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); 
    } 
+0

Cóż, to było 4-6 godzin mojego życia, nigdy nie wrócę. Jaka straszna decyzja ze strony Microsoftu, aby to się nie zawiesić. –

Odpowiedz

9

Z dokumentacji .NET 4.0:

W .NET Framework w wersji 2.0 i wcześniejszych, komponent czasowy połowy i tłumi wszelkie wyjątki generowane przez obsługi zdarzeń dla zdarzenia który upłynął. To zachowanie może ulec zmianie w przyszłych wydaniach .NET Framework.

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

Nie ma jeszcze oświadczenie, twierdząc, że to zachowanie rzeczywiście zmieniło.

+0

Ahh, to by to było, Dzięki - rzeczywiście przeczytałem tę stronę, ale muszę jej nie zauważyć. Sądzę, że bezmyślnie założyłem, że coś, co jest sprzeczne ze standardową praktyką nie tłumienia nieobsługiwanych wyjątków, mieściłoby się w jednym z tych ładnych żółtych pudełek. – Tyson

+0

@Tyson, uzgodniono. Wprowadza brzydką niezgodność z innymi miejscami. –

Powiązane problemy