Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Thread.ResetAbort的优点_C#_.net_Multithreading - Fatal编程技术网

C# Thread.ResetAbort的优点

C# Thread.ResetAbort的优点,c#,.net,multithreading,C#,.net,Multithreading,当通过thread.Abort()取消线程时,会在调用thread.Abort()的线程内抛出ThreadAbortException。这会导致线程立即停止工作,异常会在调用堆栈中冒泡,直到它离开线程的主方法。这会导致线程中止 在threads main方法中调用Thread.ResetAbort()的ThreadAbortException的ExceptionHandler对ThreadAbortException有什么好处,因为线程退出了它的主方法而在catch块之后终止了自身 privat

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

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

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

也许你会这么做的唯一原因是,如果你处于一个很好的位置来决定是否应该堕胎

因此,线程可能会捕获它,检查某些内容的状态,然后再次返回工作。尽管这确实意味着您基本上是在使用“
.abort()
”来控制此线程的流。这是个很糟糕的主意。你应该用另一种方式与它沟通


一般来说,我认为这是一个好主意的情况并不多,对于我能想到的任何特定模式或实现,这都不是一个建议。

在您特定的情况下,这并没有真正的区别,因为一旦方法运行完,线程就会终止


然而,在另一种情况下,您可能有一个在无止境循环中运行的方法。在本例中,您可以使用ThreadAbortException关闭线程(我不是说您应该关闭线程,但您可以)。如果线程出于某种原因决定继续执行异常,则需要调用ResetAbort以防止运行时自动重新引发ThreadAbortException

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

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

    // clean up and end gracefully

}

我发现调用
ResetAbort()
对使用超时模式的WaitFor有很大帮助。

这正是我的本意。我只是想澄清一下,因为我正在看一段代码,上面的语句到处都在使用。下面是一个很好的地方: