繁体   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