答案 0 :(得分:23)
一般情况下,不暂停(或中止)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...
}
然后另一个具有访问权限的线程(可能是间接的)可以暂停(Reset
)并恢复(Set
)工作者,但是知道它只是在安全状态下暂停。
重新评论(在另一个回复中) - 听起来你有一个读者和作家;适用于生产者/消费者场景。我有一个示例on this question如何编写具有上限大小的生产者/消费者(因此如果消费者运行缓慢,它将不会淹没) - 如果没有数据,则消费者阻止,并且生产者阻止太多了。
答案 1 :(得分:8)
如果你中止了线程,它将无法再次运行。您可以在不同的线程上运行相同的任务(例如,相同的ThreadStart
委托),但是它没有再次运行相同的线程。
我会强烈建议你不要强行中止线程,除非你的应用程序崩溃。相反,请改为制定graceful thread termination协议,以便告诉任务您希望它停止。 “暂停”一个线程也是如此 - 你真的不希望在它持有一些关键资源时暂停一个线程。
也许如果你能告诉我们你的情况,我们可以提供更多帮助。使用monitors(请参阅页面的后半部分)或wait handles可以轻松实现优雅的暂停/恢复或取消功能。
答案 2 :(得分:1)
如果您需要暂停一段时间,请致电Sleep
。
如果需要暂停直到某些条件成立,请使用条件变量或等待。
对于.NET中的条件变量,使用Monitor
方法,包括Wait
和Pulse
; see here介绍。 (Windows Vista还为Win32 API添加了本机条件变量支持,但这是一个完全独立的实现,.NET自V1.0起就具有条件变量支持。)
For Waits:蚂蚁使用WaitAny
或WaitAny
类的方法重载来等待.NET中公开的各种Win32同步对象类型之一作为子类WaitHandle
(事件,互斥,等待计时器等)。
答案 3 :(得分:0)
如果您想这样做,即使这是一个坏主意,请查看暂停和恢复方法 - MSDN对此主题有more info,包括为什么这是一个坏主意。
重复 - 我强烈建议你改用Marc Gravell的解决方案。