线程暂停并恢复c#

时间:2011-02-19 19:47:12

标签: c# .net multithreading

我有几个帖子,我怎么能暂停/恢复它们?


来自重复的问题:

如何暂停5个帖子,并记住他们的状态。因为其中一个正在吃另一个正在思考等等。

5 个答案:

答案 0 :(得分:15)

如果您使用System.Threading.Thread,则可以拨打SuspendResume。但不建议这样做。当你致电Suspend时,没有人知道线程可能在做什么。例如,如果您在线程持有锁定时调用Suspend,或者打开一个文件进行独占访问,则其他任何内容都无法访问锁定的资源。

正如Thread.Suspend的文档所说:

  

不要使用暂停和恢复   同步活动的方法   线程。你无从知晓   线程正在执行什么代码   你暂停它。如果你暂停了   线程,而它持有锁定期间   安全许可评估,其他   AppDomain中的线程可能是   受阻。如果你暂停一个线程   它正在执行一个类构造函数,   AppDomain中的其他线程   尝试使用该类被阻止。   死锁很容易发生。

通常,您使用事件等同步原语来控制线程的活动。线程将等待事件(查看AutoResetEventManualResetEvent)。或者,如果一个线程正在为一个队列提供服务,你将使用类似BlockingCollection的东西,这样线程就可以等待某些东西被放入队列。所有这些非繁忙的等待技术都比任意暂停和重新启动线程要好得多,并且不会遭受潜在的灾难性后果。

答案 1 :(得分:2)

您必须使用同步技术

MSDN Thread Synchronization

答案 2 :(得分:2)

首先看一下Monitor.WaitMonitor.Pulse - Marc Gravell有一个nice example used in a queue here

很可能你想考虑使用Producer/Consumer队列。

答案 3 :(得分:1)

在主线程中:

ManualResetEvent re = new ManualResetEvent(true);

在所有主题中,在“战略”点:

re.WaitOne();

在主线程中,停止线程:

re.Reset();

并重启:

re.Set();

答案 4 :(得分:0)