2011-07-28 101 views
2

我有一個線程池,我使用一個庫,如果滿足某些條件會拋出異常。我的問題是,如果IDE耗盡,線程是否會停下來,或整個程序會停止?在線程池中拋出異常

回答

3

如果應用程序是.Net 2+,非主線程上的未處理異常將會使進程變平。

您可以使用app.config LegacyUnhandledExceptionPolicy設置來配置此行爲,但我不會推薦此操作,因爲它可能會掩蓋嚴重的錯誤。

更新

如果您希望忽略偶爾超時異常,考慮將你的Web服務調用在try \ catch塊,並忽略超時異常:

try 
{ 
    //Call WebService 
} 
catch(System.Net.WebException ex) 
{ 
    //Ignore 
} 
+0

測試該如何我剛剛殺線程? –

+0

@Joe你能解釋一下爲什麼你想殺死這個線程。你想解決什麼問題? –

+0

+1 LegacyUnhandledExceptionPolicy看起來好像會做OP所要的那樣 – Andomar

1

當調試器打破了程序,所有的線程都會停下來。

Debug -> Windows -> Threads屏幕上,您可以看到線程。您可以「凍結」一個線程,這意味着如果您繼續運行該程序,它將保持停止狀態。

因此即使調試程序運行時也可能會使一些線程暫停。相反是不可能的:當調試器處於中斷模式時,沒有線程可以運行。

+0

那麼當它出現在現實世界中時會發生什麼? –

+0

@Joe Tyman:啊,所以通過「脫離IDE」你的意思是「在IDE之外」:)在現實世界中,程序將崩潰,Windows將向用戶顯示一個對話框。你可以通過三種方法來防止這種情況:1)所有線程中的try ... catch塊; 2)LegacyUnhandledExceptionPolicy設置; 3)如果作爲Windows服務運行,線程中的異常不會終止程序 – Andomar

3

所以讓我們回顧你所擁有的:

  • 你有一個TheadPool線程執行的方法。
  • 此方法將引發異常。
  • 該異常不會由try-catch塊處理。
  • 該應用程序在IDE外部運行。

現在我們可以使用下面的代碼輕鬆測試它。注意下面的觀察,尤其是大膽的觀察,因爲它們在你的問題中很有趣。

public static void Main() 
{ 
    ThreadPool.QueueUserWorkItem(
     (state) => 
     { 
      throw new InvalidOperationException(); 
     }, null); 

    while (true) 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine(DateTime.Now.ToString()); 
    } 
} 

在IDE外部運行時,您將觀察到以下情況。

  • 出現一個對話框,提示「[應用程序]遇到問題,需要關閉,我們對此造成的不便深表歉意。」
  • 應用程序將繼續運行並每秒打印當前時間。
  • 在單擊關閉對話框後,應用程序將終止

在IDE內運行時您將觀察到以下內容。

  • IDE將攔截異常並使用其自己的未處理異常窗口顯示它。
  • 所有線程都將被暫停,這意味着您將看不到當前顯示的時間。
  • 忽略異常並恢復調試會話將允許當前時間開始顯示。
  • IDE將再次重新拋出異常並截取它。
  • 所有線程都將被暫停,循環將無限期重複。

我與Visual Studio 2010