Thread.Abort vs Thread.Interrupt

时间:2011-05-10 13:42:02

标签: c# multithreading

如果我需要取消线程上的某些操作,我应该何时使用Thread.Abort vs Thread.Interrupt。我阅读了有关它的文档,但不确定我应该在两个之间使用特定的调用。

如果有任何第三种方式,请让我知道它的利弊。

4 个答案:

答案 0 :(得分:20)

我会不惜一切代价避免使用Thread.Abort。自从.NET 2.0以来,它的行为更加安全和可预测,但它仍然存在一些非常严重的陷阱。托管代码中的大多数中止都可以安全,但不是全部。例如,我相信如果在处理静态构造函数期间触发中止请求,则存在一些微妙的问题。没关系,事实上,带外异常可以在任何时候发生,使您无法控制定义关闭安全点的位置。

有几种可以正常终止线程的方法。

  • 使用Thread.Interrupt
  • 投票停止标志
  • 使用WaitHandle个活动
  • 专门的API调用

我在答案here中讨论了这些方法。

答案 1 :(得分:7)

大多数建议已经完成,但这是我如何做的一个例子:

    ManualResetEvent _requestTermination = new ManualResetEvent(false);
    Thread _thread;

    public void Init()
    {
        _thread = new Thread(() =>
         {

             while (!_requestTermination.WaitOne(0))
             {
                 // do something usefull

             }

         }));

        _thread.Start();
    }

    public void Dispose()
    {
        _requestTermination.Set();

        // you could enter a maximum wait time in the Join(...)
        _thread.Join();
    }

这样,dispose将一直等到线程退出。

答案 2 :(得分:3)

我永远不会使用Thread.Abort。它几乎在任意时间引起异常。

答案 3 :(得分:2)

小心 Thread.Interrupt 。如果你没有建立一些等待或休眠时间,线程就不会被打断。

小心 Thread.Abort 。如果你抓住ThreadAbortException你的线程将在catch + finally之后立即终止。

(我喜欢使用这些方法向我的线程发送信号,以便它知道它的终止时间,然后清理并退出。)