Thread.ResetAbort的好处

时间:2009-08-27 07:39:49

标签: c# .net multithreading

当通过Thread.Abort()取消线程时,Thread Thread.Abort内部会抛出一个ThreadAbortException。这导致线程立即停止其工作,异常冒泡调用堆栈,直到它离开线程的main方法。这会导致线程中止。

线程main方法中ThreadAbortException的ExceptionHandler有什么好处,其中调用了Thread.ResetAbort(),当线程因为跳出其主方法而在catch块之后终止自身?

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

4 个答案:

答案 0 :(得分:6)

我能想到的一个场景是你想以受控的方式取消线程。假设您有一个正在轮询某些资源的工作线程。如果应用程序的主线程在工作线程上调用Abort,则抛出ThreadAbortException。然后,您可以在工作线程的start方法中捕获该异常,调用ResetAbort,然后通过释放资源,关闭打开的文件/连接等来完成该方法:

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

    // clean up and end gracefully

}

答案 1 :(得分:2)

你做这件事的唯一原因可能就是你是否有能力决定你是否应该中止。

所以也许线程会抓住它,检查某些东西的状态,然后再回过头来看看它的工作。虽然这确实意味着您基本上使用“.abort()”来控制此线程的流量。这是一个非常糟糕的主意。你应该用另一种方式与它沟通。

总的来说,我认为没有多少情况下这是一个好主意,并且它不会是我能想到的任何特定模式或实现的建议。

答案 2 :(得分:2)

在特定情况下,它并没有什么区别,因为一旦方法运行完毕,线程将被终止。

但是,在其他情况下,您可能有一个无限循环运行的方法。在这种情况下,您可以使用ThreadAbortException关闭线程(我不是说你应该,但你可以)。如果由于某种原因线程确定继续,尽管异常它需要调用ResetAbort以防止运行时自动重新抛出ThreadAbortException。

答案 3 :(得分:1)

我发现在{em> WaitFor with time-out 模式的this elegant implementation中调用ResetAbort()会有很大的帮助。