我不知道为什么,但我不能再打断我自己的线程了。
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?
答案 0 :(得分:4)
来自BOL:
顺便说一句,你可能最好使用支持取消的中断线程中的线程 WaitSleepJoin线程状态。
如果此线程当前不是 在等待,睡眠或加入时被阻止 状态,它会被打断 接下来开始阻止。
抛出ThreadInterruptedException 在被打断的线程中,但不是 直到线程阻塞。如果线程 永远不会阻止,例外永远不会 抛出,因此线程可能 完全没有 中断
BackgroundWorker
类。
答案 1 :(得分:0)
从acidzombie24的评论到另一个answer:
所以.abort是更好的选择吗?我想做的是杀死线程,但让它存在并调用一些函数而不是直接死亡
事件会更好。
假设您希望能够单独发出每个线程的信号,在每个工作线程启动之前创建一个AutoResetEvent并将其传递给线程。
如果要在事件中中断线程调用Set。在工作线程中定期检查事件的状态:
if (theEvent.WaitOne(TimeSpan.Zero)) {
// Handle the interruption.
}
(定期:需要由要求定义:检查开销与中断延迟。)
要发出主中断,向所有工作人员发出信号,请使用ManualResetEvent来保持信号,并在检查时保持中断线程,直到明确Reset。