Thread.Abort vs Thread.Interrupt

Sil*_*ent 22 c# multithreading

如果我需要取消一个线程一些操作,我什么时候应该使用Thread.AbortVS Thread.Interrupt.我阅读了有关它的文档,但不确定哪个scneario我应该使用两个之间的特定调用.

如果有任何第三种方式,请让我知道它与赞成和利弊.

Bri*_*eon 21

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

有几种可以接受的方法可以优雅地终止线程.

  • 使用 Thread.Interrupt
  • 轮询停止标志
  • 使用WaitHandle事件
  • 专门的API调用

我在这里的答案中讨论了这些方法.

  • “如果您在非托管代码中中止线程”,我很确定 Thread.Abort 会一直等到您回到托管代码中。就像位于“finally”块中的线程在完成finally 之前不会终止。 (2认同)

Jer*_*gen 8

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

    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();
    }
Run Code Online (Sandbox Code Playgroud)

这样处理将等待线程退出.