首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.Abort vs Thread.Interrupt

Thread.Abort vs Thread.Interrupt
EN

Stack Overflow用户
提问于 2011-05-10 21:42:02
回答 4查看 24.1K关注 0票数 24

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

如果有第三种方法,请让我知道它的正反两面。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-10 22:00:13

我会不惜一切代价避免使用Thread.Abort。从.NET 2.0开始,它的行为更加安全和可预测,但仍然存在一些相当严重的缺陷。托管代码中的大多数中止都是安全的,但不是所有的。例如,如果在处理静态构造函数的过程中触发中止请求,我认为会有一些微妙的问题。没关系,带外异常可以在任何时候发生,这让您几乎无法控制关闭的安全点所在的位置。

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

  • Use Thread.Interrupt
  • Poll a stopping
  • Use WaitHandle events
  • Specialized API

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

票数 22
EN

Stack Overflow用户

发布于 2013-08-09 19:20:08

大多数建议都已经完成了,但这里有一个我将如何执行的示例:

代码语言:javascript
复制
    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.Sleep。使用WaitOne(delayTime)。这样一来,你就再也不用等着终止它了。

票数 9
EN

Stack Overflow用户

发布于 2011-05-10 21:45:23

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5950994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档