当通过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( );
}
}
答案 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()
会有很大的帮助。