8

In che modo un'applicazione ASP.NET deve gestire eccezioni non gestite che si verificano in un thread in background non richiesto (a causa di bug)?Come trattare le eccezioni thread non gestite in ASP.NET?

Per impostazione predefinita, tali eccezioni causare il processo per terminare. Questo è inaccettabile nell'impostazione di un processo di lavoro ASP.NET perché le richieste in esecuzione simultanee vengono interrotte in modo imprevedibile. È anche un problema di prestazioni.

eccezioni su un thread di richiesta non sono un problema perché ASP.NET li gestisce (mostrando una pagina di errore).

L'evento AppDomain.UnhandledException consente di osservare che si è verificata un'eccezione, ma la chiusura non può essere impedita in quel punto.

Ecco una replica che deve essere incollata in una pagina ASPX codebehind.

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(); 
} 

L'unica soluzione che conosco è non lasciare mai che un'eccezione "sfugga" non gestita. C'è qualche altra soluzione più globale e completa per questo?

+0

Sto vivendo lo stesso problema ... è strano come il team di asp.net non abbia mai considerato una soluzione a questo problema.Ho un modulo http di terza parte che non riesce ad un certo punto e genera eccezioni che fanno sì che il processo di lavoro visualizzi "Servizio non disponibile" !!! –

risposta

0

Rx (Programmazione reattiva) è nato per risolvere problemi come questo, provate a pensare di cambiare il quadro attualmente in uso e sostituirlo con Rx

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

I pacchetti Nugget:

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

Questo è il codice Rx equivalente:

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

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

Come si può vedere l'errore non sfuggirà il thread in background quando si specifica un gestore per l'errore, onError => { }

Se non si specifica un gestore di errori, l'eccezione viene propagata:

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

nell'esempio di cui sopra, l'eccezione verrà propagata e causerà gli stessi problemi come il codice scritto

+0

Sto facendo il threading in un contesto in cui non ho a che fare con flussi di eventi. Non sono sicuro se Rx è una buona misura qui. – usr

+0

Bene, Rx è molto più che gestire il flusso di eventi, questo era l'obiettivo principale ma il framework si è evoluto e sa che contiene una ricca API per gestire i metodi asincroni. L'unica ragione per cui non consiglierei Rx ** ancora **, è che se esegui i thread in background in parallelo, anche quando Rx fornisce un'API per questo, ho trovato che è meglio usare l'oggetto 'Task' – Jupaol