Mar*_*ell 23

一般情况下,不要暂停(或中止)a Thread- 你通常无法分辨它在做什么,这可能导致各种锁定问题,例如未释放的锁或类型初始化程序(静态构造函数)悬空.

但是,您可以通过更优雅的方法暂停代码 - 例如,ManualResetEvent在循环中使用外部代码(在另一个线程上)可以打开和关闭:

// worker loop
while(alive) {
    // if the gate is closed, wait up to 5 seconds; if still not
    // open, go back to the loop-start to re-check "alive"
    if (!gate.WaitOne(5000)) continue;

    // do work...
}
Run Code Online (Sandbox Code Playgroud)

然后另一个具有访问权限(可能是间接的)的线程可以暂停(Reset)和恢复(Set)工作者,但是知道它只是在安全状态下暂停.


重新评论(在另一个回复中) - 听起来你有一个读者和作家; 适用于生产者/消费者场景.我有一个关于如何编写具有上限大小的生产者/消费者的问题的例子(因此如果消费者运行缓慢,它将不会淹没) - 如果没有数据则消费者阻止,并且如果有数据则生产者阻止太多了.


Jon*_*eet 8

如果您中止了线程,它将无法再次运行.您可以ThreadStart在不同的线程上运行相同的任务(例如,同一个委托),但这不会再次运行相同的线程.

除非你的应用程序崩溃,否则我强烈建议你不要强行中止线程.相反,请改为使用优雅的线程终止协议,这样您就可以告诉任务您希望它停止."暂停"一个线程也是如此 - 你真的不希望在它持有一些关键资源时挂起一个线程.

也许如果你能告诉我们更多你的情况,我们可以提供更多帮助.使用监视器(参见页面的后半部分)或等待句柄可以很容易地实现优雅的暂停/恢复或取消功能.

  • 我特此建议禁止Jon Skeet和Marc Gravell ......你被禁止在前30分钟回答复杂的问题并且永远回答简单的问题:P (4认同)