2012-06-20 12 views
8

¿Cómo se supone que una aplicación ASP.NET trata las excepciones no controladas que se producen en un hilo de fondo que no es de solicitud (debido a errores)?¿Cómo tratar las excepciones de subprocesos no controladas en ASP.NET?

De manera predeterminada, tales excepciones hacen que el proceso finalice. Esto es inaceptable en la configuración de un proceso de trabajo de ASP.NET porque las solicitudes que se ejecutan simultáneamente se cancelan de forma imprevista. También es un problema de rendimiento.

Las excepciones en un subproceso de solicitud no son un problema porque ASP.NET las maneja (al mostrar una página de error).

El evento AppDomain.UnhandledException permite observar que se ha producido una excepción, pero la terminación no se puede evitar en ese punto.

Aquí hay una reproducción que debe pegarse en un código de página ASPX detrás.

protected void Page_Load(object sender, EventArgs e) 
{ 
    var thread = new Thread(() => 
     { 
      throw new InvalidOperationException("some failure on a helper thread"); 
     }); 
    thread.Start(); 
    thread.Join(); 
} 

La única solución que conozco es no dejar nunca que una excepción "escape" no se maneje. ¿Hay alguna otra solución más global y exhaustiva para esto?

+0

Tengo el mismo problema ... es extraño cómo el equipo asp.net nunca consideró una solución para esto.Tengo un módulo http de tercera parte que está fallando en algún momento y arrojando excepciones que hacen que el proceso de trabajo muestre "Servicio no disponible". –

Respuesta

0

Rx (Programación Reactiva) nació para resolver problemas como éste, trata de la modificación del marco que utiliza actualmente y reemplazarlo con Rx

http://msdn.microsoft.com/en-us/data/gg577609.aspx

Los paquetes de la pepita:

https://nuget.org/packages/Rx-Main/1.0.11226

Este es el código Rx equivalente:

 var o = Observable.Start(() => { throw new NotImplementedException(); }); 

     o.Subscribe(
      onNext => { }, 
      onError => { }, 
      () => { Console.WriteLine("Operation done"); }); 

Como se puede ver el error no escapará el hilo de fondo cuando se especifica un manejador por el error, onError => { }

Si no se especifica un controlador de errores, la excepción se propagará:

 o.Subscribe(
      onNext => { }, 
      () => { Console.WriteLine("Operation done"); }); 

en el ejemplo anterior, la excepción se propagará y hará que los mismos problemas que su código publicado

+0

Estoy haciendo subprocesos en un contexto en el que no estoy tratando con flujos de eventos. No estoy seguro si Rx es una buena opción aquí. – usr

+0

Bueno, Rx es mucho más que solo tratar con flujo de eventos, ese fue el objetivo principal, pero el marco ha evolucionado y sabe que contiene una API rica para tratar con métodos asíncronos. La única razón por la que no recomendaría Rx ** aún **, es que si ejecuta los subprocesos de fondos en paralelo, incluso cuando Rx proporciona una API para esto, he encontrado que es mejor usar el objeto 'Tarea' – Jupaol

Cuestiones relacionadas