2009-08-27 60 views
4

當通過Thread.Abort()取消某個線程時,會在Thread Thread.Abort內部引發一個ThreadAbortException。這導致線程立即停止工作,異常冒出了調用堆棧,直到它離開線程的主要方法。這會導致線程中止。Thread.ResetAbort的優點

ThreadHeader對於線程主方法中的ThreadAbortException異常,Thread.ResetAbort()被調用時,當線程在catch塊之後由於跳出其主方法而自行終止時,有什麼好處?

private void ThreadMainMethod() 
{ 
    try 
    { 
     while(runningAllowed = true) 
     { 
      //Do some work here 
     } 
    } 
    catch (ThreadAbortException) 
    { 
     Thread.ResetAbort(); 
    } 
} 

回答

2

如果你有能力決定是否應該實際放棄,那麼你可能會這樣做的唯一原因。

所以也許線程會抓住它,檢查一些東西的狀態,然後再回到它的工作。雖然這確實意味着你基本上使用'.abort()'來控制這個線程的流程。這真是一個糟糕的主意。你應該用另一種方式與它溝通。

總的來說,我認爲沒有太多的情況下這是一個好主意,它不會成爲我能想到的任何特定模式或實現的建議。

+0

這正是我的意思。我只是想澄清一下,因爲我現在正在查看一段代碼,上面的語句遍佈全球。 – PVitt 2009-08-27 07:58:13

+0

下面是使用它的好地方:https://stackoverflow.com/questions/299198/implement-c-sharp-generic-timeout/299273#299273 – TheSoftwareJedi 2017-08-22 22:00:37

2

在你特別的情況下,它並沒有真正的區別,因爲一旦方法完成運行,線程就會被終止。

但是,在其他情況下,您可能有一個無限循環運行的方法。在這種情況下,可以使用ThreadAbortException關閉線程(我不是說你應該,但你可以)。如果線程出於某種原因決定繼續執行,則需要調用ResetAbort以防止運行時自動重新拋出ThreadAbortException。

5

我能想到的一種情況是,您想以受控的方式取下線程。假設您有一個工作線程輪詢某個資源。如果應用程序的主線程在工作線程上調用Abort,則會拋出ThreadAbortException。然後,您可以趕上在啓動方法是例外的工作線程,調用ResetAbort然後通過釋放資源完成的方法,關閉打開的文件/連接等:

public void ThreadStarter() 
{ 
    try 
    { 
     RunWorkerLoop(); 
    } 
    catch (ThreadAbortException) 
    { 
     Thread.ResetAbort(); 
    } 

    // clean up and end gracefully 

}