2012-06-20 17 views
8

W jaki sposób aplikacja ASP.NET ma radzić sobie z nieobsługiwanymi wyjątkami występującymi na wątku w tle niezwiązanym z żądaniem (z powodu błędów)?Jak traktować nieobsługiwane wyjątki wątków w środowisku ASP.NET?

Domyślnie takie wyjątki spowodować przerwanie procesu. Jest to niedopuszczalne w ustawieniach procesu roboczego ASP.NET, ponieważ jednocześnie uruchomione żądania są przerywane nieprzewidywalnie. Jest to także problem z wydajnością.

wyjątków wątku żądanie nie są problemem, ponieważ obsługuje je ASP.NET (pokazując stronę błędu).

Zdarzenie AppDomain.UnhandledException pozwala stwierdzić, że wyjątek nastąpiło, ale rozwiązanie nie można uniknąć w tym punkcie.

Oto repro który musi zostać wklejony stronę kodzie ASPX.

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

Jedynym rozwiązaniem Znam to, aby nigdy nie pozwolić wyjątek „uciec” nieobsługiwany. Czy istnieje inne, bardziej globalne i dokładne rozwiązanie tego problemu?

+0

mam przeżywa ten sam problem ... nigdy jej dziwne jak zespół asp.net uważany za rozwiązanie tego.Mam trzeci moduł http, który w pewnym momencie przestaje działać i generuje wyjątki, które powodują, że proces roboczy wyświetla "Service Unavailable" !!! –

Odpowiedz

0

Rx (Reactive Programming) urodził się w celu rozwiązania problemów takich jak ten, spróbuj rozważyć zmianę ram aktualnie używane i zastąpienie go Rx

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

Pakiety Nugget:

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

To jest równoważny kod Rx:

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

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

Jak widzisz błąd nie ujdzie wątku tła, gdy podasz obsługi dla błędu, onError => { }

Jeśli nie określisz obsługi błędów, wyjątek będą propagowane:

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

w powyższym przykładzie, wyjątek będą propagowane i powoduje takie same problemy jak twój pisał kod

+0

Robię wątkowanie w kontekście, w którym nie mam do czynienia ze strumieniami zdarzeń. Nie jestem pewien, czy Rx dobrze tu pasuje. – usr

+0

No cóż, Rx to znacznie więcej niż radzenie sobie ze strumieniem zdarzeń, to był główny cel, ale framework ewoluował i wie, że zawiera bogate API do radzenia sobie z metodami asynchronicznymi. Jedynym powodem, dla którego nie polecałbym Rx ** jeszcze **, jest to, że jeśli uruchamiasz swoje wątki równolegle, nawet gdy Rx dostarcza do tego API, to stwierdziłem, że lepiej jest użyć obiektu 'Task' – Jupaol