2012-06-20 171 views
8

ASP.NET應用程序應該如何處理髮生在非請求後臺線程上的未處理異常(由於缺陷)?如何在ASP.NET中處理未處理的線程異常?

默認情況下,這些異常會導致進程終止。 在設置ASP.NET工作進程時,這是不可接受的,因爲併發運行的請求會以不可預測的方式中止。這也是一個性能問題。

請求線程的異常不是問題,因爲ASP.NET處理它們(通過顯示錯誤頁面)。

AppDomain.UnhandledException事件允許觀察發生了異常,但在此時無法阻止終止。

這是一個需要粘貼到ASPX頁面代碼隱藏的repro。

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

我知道的唯一解決方案是永遠不會讓異常「逃脫」未處理。有沒有其他更全面徹底的解決方案呢?

+0

我遇到同樣的問題......奇怪的是,asp.net團隊從來沒有考慮過解決這個問題。我有第三部分http模塊,在某些時候失敗並拋出異常,導致工作進程顯示「服務不可用」!!! –

回答

0

的Rx(反應式編程)的誕生,解決這樣的問題,儘量考慮改變你目前使用的框架和其中Rx更換

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

塊金包:

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

這是等效的Rx代碼:

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

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

正如你可以看到當你指定一個處理程序錯誤誤差不會逃避後臺線程,onError => { }

如果不指定錯誤處理程序,異常會被傳播:

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

在上面的例子中,異常將被傳播,並會導致同樣的問題你貼的代碼

+0

我在沒有處理事件流的情況下正在執行線程。不確定Rx是否適合這裏。 – usr

+0

好吧,Rx不僅僅是處理事件流,這是主要目標,但是框架已經發展並且知道它包含了一個處理異步方法的豐富API。我不推薦Rx **的唯一原因是**,如果你並行運行你的背景線程,即使Rx爲此提供了一個API,我也發現使用Task對象更好一些 – Jupaol