【问题标题】:Benefits of Thread.ResetAbortThread.ResetAbort 的好处
【发布时间】:2010-11-23 06:59:12
【问题描述】:

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

在调用Thread.ResetAbort() 的线程main 方法中,当线程在catch 块之后由于单步执行其main 方法而自行终止时,对于ThreadAbortException 的ExceptionHandler 有什么好处?

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

【问题讨论】:

    标签: c# .net multithreading


    【解决方案1】:

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

    public void ThreadStarter()
    {
        try
        {
            RunWorkerLoop();
        }
        catch (ThreadAbortException)
        {
            Thread.ResetAbort();
        }
    
        // clean up and end gracefully
    
    }
    

    【讨论】:

      【解决方案2】:

      您这样做的唯一原因可能是如果您能够决定是否真的应该中止。

      所以也许线程会捕获它,检查某些东西的状态,然后再返回它的工作。尽管这确实意味着您基本上是在使用“.abort()”来控制该线程的流程。这是一个非常糟糕的主意。你应该用另一种方式与它交流。

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

      【讨论】:

      • 这正是我的本意。我只是想澄清一下,因为我目前正在查看一段代码,上面的语句被到处使用。
      • 这里有个好用的地方:stackoverflow.com/questions/299198/…
      【解决方案3】:

      在您的特定情况下,它并没有真正的区别,因为一旦方法运行完成,线程将被终止。

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

      【讨论】:

        【解决方案4】:

        我发现调用ResetAbort()WaitFor with timeout 模式的this elegant implementation 有很大帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-08
          相关资源
          最近更新 更多