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
)工作者,但是知道它只是在安全状态下暂停.
重新评论(在另一个回复中) - 听起来你有一个读者和作家; 适用于生产者/消费者场景.我有一个关于如何编写具有上限大小的生产者/消费者的问题的例子(因此如果消费者运行缓慢,它将不会淹没) - 如果没有数据则消费者阻止,并且如果有数据则生产者阻止太多了.
如果您中止了线程,它将无法再次运行.您可以ThreadStart
在不同的线程上运行相同的任务(例如,同一个委托),但这不会再次运行相同的线程.
除非你的应用程序崩溃,否则我强烈建议你不要强行中止线程.相反,请改为使用优雅的线程终止协议,这样您就可以告诉任务您希望它停止."暂停"一个线程也是如此 - 你真的不希望在它持有一些关键资源时挂起一个线程.
也许如果你能告诉我们更多你的情况,我们可以提供更多帮助.使用监视器(参见页面的后半部分)或等待句柄可以很容易地实现优雅的暂停/恢复或取消功能.
归档时间: |
|
查看次数: |
14112 次 |
最近记录: |