【问题标题】:C# thread interruption stopped workingC#线程中断停止工作
【发布时间】:2009-04-05 08:06:58
【问题描述】:

我不知道为什么,但我不能再打断我自己的线程。

thread = new Thread(new ParameterizedThreadStart(this.doWork));
thread.Start(param);
...
thread.Interrupt();
//in doWork()
try {
...
}
catch (System.Threading.ThreadInterruptedException)
{
//it never hits here. it use to
}

我搜索并且我的代码中没有任何问题,这是唯一的问题 (System.Threading.ThreadInterruptedException)。那么发生了什么?使用调试器,我可以看到我的代码通过 thread.Interrupt(); 运行。如果我执行 thread.abort() 我将捕获 System.Threading.ThreadAbortException 异常。为什么它会捕获它而不是 ThreadInterruptedException?

【问题讨论】:

    标签: c# multithreading exception


    【解决方案1】:

    来自BOL

    中断一个线程 WaitSleepJoin 线程状态。

    如果此线程当前不是 在等待、睡眠或加入时被阻塞 状态,当它会被中断 接下来开始阻塞。

    抛出ThreadInterruptedException 在被中断的线程中,但不是 直到线程阻塞。如果线程 从不阻塞,异常是从不 抛出,因此线程可能 完整而不存在 打断了

    顺便说一句,您最好使用支持取消的BackgroundWorker 类。

    【讨论】:

    • +1。通常应避免中断线程 - 使用更优雅的取消机制。
    • 听起来它根本不应该打断(我想知道我是怎么做到的)。那么 .abort 是更好的选择吗?我想要做的是杀死线程但让它存在并调用一些函数而不是彻底死亡
    • 通常最好发出信号让线程优雅地终止,而不是杀死它
    【解决方案2】:

    acidzombie24 的评论到另一个answer

    那么 .abort 是更好的选择吗?我想要做的是杀死线程但让它存在并调用一些函数而不是彻底死亡

    像活动这样的东西会更好。

    假设您希望能够分别向每个线程发出信号,在每个工作线程启动之前创建一个 AutoResetEvent 并将其传递给线程。

    当你想在事件上中断线程调用Set。在工作线程中定期检查事件的状态:

    if (theEvent.WaitOne(TimeSpan.Zero)) {
      // Handle the interruption.
    }
    

    (通常:需要由需求定义:检查开销与中断延迟。)

    要拥有主中断,向所有工作人员发出信号,请使用ManualResetEvent,它将保持信号状态,并在线程检查时继续中断线程,直到明确Reset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多