簡體   English   中英

線程池中引發異常

[英]Exception Thrown in thread pool

我有一個線程池,並且我使用了一個庫,如果滿足某些條件,該庫將引發異常。 我的問題是,如果這用盡了IDE,線程會停止還是整個程序都停止?

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

您可以使用app.config LegacyUnhandledExceptionPolicy設置配置此行為,但我不建議您這樣做,因為它可能掩蓋嚴重的錯誤。

更新

如果您希望忽略偶爾的超時異常,請考慮將WebService調用放在try \\ catch塊中,並忽略超時異常:

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

因此,讓我們回顧一下您擁有的東西:

  • 您有一個在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 1中運行時,您將看到以下內容。

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

1我使用Visual Studio 2010對此進行了測試。

當調試器中斷程序時,所有線程都將停止。

Debug -> Windows -> Threads屏幕中,您可以看到線程。 您可以“凍結”線程,這意味着如果繼續運行該程序,它將保持暫停狀態。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM