我正在閱讀一本關於通用c#開發的書,我已經到了線程中止部分。捕捉ThreadAbortException時隱藏Throw的處理是什麼?
這本書說了一些事情,當你在另一個線程上調用Thread.Abort()時,該線程將拋出一個ThreadAbortException異常,即使你試圖禁止它,它也會自動重新拋出它,除非你做了一些bs這通常是皺眉。這裏提供了一個簡單的例子。
using System;
using System.Threading;
public class EntryPoint
{
private static void ThreadFunc()
{
ulong counter = 0;
while (true)
{
try
{
Console.WriteLine("{0}", counter++);
}
catch (ThreadAbortException)
{
// Attempt to swallow the exception and continue.
Console.WriteLine("Abort!");
}
}
}
static void Main()
{
try
{
Thread newThread = new Thread(new ThreadStart(EntryPoint.ThreadFunc));
newThread.Start();
Thread.Sleep(2000);
// Abort the thread.
newThread.Abort();
// Wait for thread to finish.
newThread.Join();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
書中說:
當你的線程處理完終止異常,運行時隱式重新拋出它在異常處理程序的結束。就像你自己重新拋出異常一樣。因此,任何外部異常處理程序或finally塊仍將正常執行。在這個例子中,加入的呼叫不會像最初預期的那樣永遠等待。
因此,我圍繞Thread.Abort()調用包裝了一個try catch,並設置了一個斷點,期待它打到這個位置,考慮到文本顯示「任何外部異常處理程序或finally塊仍將正常執行」。但它不是。我正在絞盡腦汁想出原因。
任何人有任何想法,爲什麼不是這種情況?這本書是錯的嗎?
在此先感謝。
你的程序輸出了什麼? – 2010-05-13 21:21:37
我希望這本書也提到Thread.Abort是邪惡的,不應該被使用。 – 2010-05-13 21:38:04
約寫20秒#儘可能多,然後中止!,然後它返回。 – priehl 2010-05-13 21:41:15