线程暂停和恢复c#
我有几个post,我怎么能暂停/恢复它们?
从重复的问题:
我如何暂停5个线程,并记住它们的状态。 因为其中一个正在吃另一个正在思考等等
如果您正在使用System.Threading.Thread
,则可以调用Suspend
and Resume
。 但不建议这样做。 当你调用Suspend
时,没有人知道线程可能在做什么。 例如,如果在线程持有锁定时调用Suspend
,或者打开一个文件以进行独占访问,则其他任何内容都无法访问锁定的资源。
正如Thread.Suspend的文档所说:
不要使用Suspend和Resume方法来同步线程的活动。 暂停它时,您无法知道线程正在执行的代码。 如果在安全权限评估期间挂起线程时挂起线程,则可能会阻止AppDomain中的其他线程。 如果在执行类构造函数时挂起线程,则会阻止AppDomain中尝试使用该类的其他线程。 死锁很容易发生。
通常,您使用事件等同步原语来控制线程的活动。 线程将等待事件(查看AutoResetEvent
和ManualResetEvent
)。 或者,如果线程正在为队列提供服务,您将使用类似BlockingCollection
东西,以便线程可以等待将某些内容放入队列。 所有这些非繁忙等待技术都比任意暂停和重新启动线程要好得多,并且不会遭受潜在的灾难性后果。
在第一个实例中看一下Monitor.Wait和Monitor.Pulse- Marc Gravell 在这里有一个很好的例子 。
您很可能想要考虑使用Producer / Consumer队列。
您必须使用同步技术
MSDN线程同步
在主线程中:
ManualResetEvent re = new ManualResetEvent(true);
在所有线程中,在“战略”点:
re.WaitOne();
在主线程中,要停止线程:
re.Reset();
并重新启动:
re.Set();
您可以使用Suspend()
和Resume()
。
http://msdn.microsoft.com/en-us/library/system.threading.thread.resume.aspx
http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx
你也可以阅读:
什么是暂停和恢复线程的替代方法?