7

Soy consciente de cómo se procesan las excepciones sin mano cuando se usa Task s, solo lanzando un no controlado en el finalizador si el código de usuario no lo ha "observado" todavía.Por qué una excepción no controlada en el subproceso del temporizador no bloquea el proceso

También conozco cómo una excepción no controlada en un subproceso asincrónico (por ejemplo, Action.BeginInvoke()) se captura y se vuelve a lanzar en la llamada de unión (por ejemplo, Action.EndInvoke()).

Lo que no entiendo es cómo esto no bloquea el proceso?

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

Bueno, esto fue 4-6 horas de mi vida que nunca volveré. Qué decisión tan horrible por parte de Microsoft no se colgó. –

Respuesta

9

De la documentación de .NET 4.0:

En la versión de .NET Framework 2.0 y anteriores, el componente Timer capturas y suprime todas las excepciones lanzadas por los controladores de eventos para el evento transcurrido . Este comportamiento está sujeto a cambios en futuras versiones de .NET Framework.

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

no hay ninguna declaración aún afirmando que este comportamiento ha cambiado en realidad.

+0

Ahh, eso sería, gracias. De hecho, leí esa página, pero debo haberla perdido. Creo que tontamente asumí que algo que va en contra de toda su práctica estándar de no suprimir excepciones no manejadas hubiera estado dentro de uno de esos lindos cuadros amarillos. – Tyson

+0

@Tyson, de acuerdo. Introduce una fea inconsistencia con otros lugares. –

Cuestiones relacionadas