簡體   English   中英

Thread.ResetAbort 的好處

[英]Benefits of Thread.ResetAbort

當通過Thread.Abort()取消線程時,會在調用Thread.Abort()的線程內拋出 ThreadAbortException。 這會導致線程立即停止工作,異常會在調用堆棧中冒泡,直到它離開線程的 main 方法。 這會導致線程中止。

Thread.ResetAbort()的線程主方法中的 ThreadAbortException 的 ExceptionHandler 有什么好處,當線程在 catch 塊之后由於退出其主方法而終止自身時?

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

我能想到的一種情況是您希望以受控方式刪除線程。 假設您有一個正在輪詢某些資源的工作線程。 如果應用程序的主線程在工作線程上調用Abort ,則會拋出ThreadAbortException 然后,您可以在工作線程的 start 方法中捕獲該異常,調用ResetAbort ,然后通過釋放資源、關閉打開的文件/連接等來完成該方法:

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

    // clean up and end gracefully

}

可能你這樣做的唯一原因是,如果你有能力決定是否真的應該流產。

所以也許線程會捕獲它,檢查某些東西的狀態,然后再次返回它的工作。 盡管這確實意味着您基本上是在使用“ .abort() ”來控制該線程的流程。 這是一個非常糟糕的主意。 你應該用另一種方式與它交流。

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

在您的特定情況下,它並沒有真正產生影響,因為一旦方法運行完畢,線程就會終止。

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

我發現調用ResetAbort()對使用超時模式的WaitFor 的這種優雅實現有很大幫助。

暫無
暫無

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

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