C#线程中断停止工作

时间:2009-04-05 08:06:59

标签: c# multithreading exception

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

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?

2 个答案:

答案 0 :(得分:4)

来自BOL

  

中断线程中的线程   WaitSleepJoin线程状态。

     

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

     

抛出ThreadInterruptedException   在被打断的线程中,但不是   直到线程阻塞。如果线程   永远不会阻止,例外永远不会   抛出,因此线程可能   完全没有   中断

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

答案 1 :(得分:0)

acidzombie24的评论到另一个answer

  

所以.abort是更好的选择吗?我想做的是杀死线程,但让它存在并调用一些函数而不是直接死亡

事件会更好。

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

如果要在事件中中断线程调用Set。在工作线程中定期检查事件的状态:

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

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

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