2011-08-31 82 views
1

我有一個函數,我調用thread.abort殺死一個線程。我知道這不是最好的做法,但我正在調用一個基本上在該函數中有無限循環的dll函數,所以我可以終止該線程的唯一方法是調用線程終止。我可以調用一個thread.join,但是我的gui會卡住。我在表單應用程序和該線程中都做了一個捕獲,但是當我調用thread.abort函數時,引發了一個異常,它被我的try塊在其中一個地方捕獲,但是我的應用程序仍然崩潰。如何捕捉ThreadAbort?

什麼是正確的方式來處理一個threadAbort,所以它不會使我的應用程序崩潰。

+0

你的應用程序如何崩潰?拋出這個其他異常的堆棧跟蹤是什麼?這是另一個DLL管理或不管理(是的,它很重要,實際上是至關重要的信息)? –

回答

6

您的應用程序崩潰,因爲ThreadAbortException會自動重新排列在處理它的任何catch塊的末尾。爲防止它被重新拋出,你需要撥打Thread.ResetAbort()

try { 
    ... 
} catch (ThreadAbortException) { 
    Thread.ResetAbort(); 
} 

注:我建議你找到另一種方法來擺脫這種方法。中止一個線程是非常危險的,應該只是最後一個機制。將取消令牌傳遞給線程或使用共享標誌退出無限循環會更安全。

1

不要使用Thread.Abort(),指示線程停止。喜歡的東西

private volatile _keepRunning = true; 

public void DoWork() 
{ 
    while(_keepRunning) 
    { 
    } 
} 

public void Abort() 
{ 
    _keepRunning = false; 
} 

,您可以得到更多的花哨ManualResetEvent s到信號末端更快,仍然使用加入,但基本概念是存在的。我經常在我們的應用中使用它,它運行良好。