Thread.Abort vs Thread.Interrupt

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

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

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

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

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

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

大多数建议已经完成,但这里有一个例子我会怎么做:

  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将等待线程退出。

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

小心Thread.Interrupt 。 如果你没有建立一些等待或hibernate时间,线程将不会被中断。

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

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