如何在C#中中止,暂停和恢复线程?

时间:2009-06-28 08:49:59

标签: c# multithreading

如何在C#中中止,暂停和恢复线程?

相关问题:

Is there a way to indefinitely pause a thread?

4 个答案:

答案 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方法,包括WaitPulse; see here介绍。 (Windows Vista还为Win32 API添加了本机条件变量支持,但这是一个完全独立的实现,.NET自V1.0起就具有条件变量支持。)

For Waits:蚂蚁使用WaitAnyWaitAny类的方法重载来等待.NET中公开的各种Win32同步对象类型之一作为子类WaitHandle(事件,互斥,等待计时器等)。

答案 3 :(得分:0)

如果您想这样做,即使这是一个坏主意,请查看暂停和恢复方法 - MSDN对此主题有more info,包括为什么这是一个坏主意。

重复 - 我强烈建议你改用Marc Gravell的解决方案。