什么是暂停和恢复线程的替代方法?

自.NET 2.0以来, Thread.Suspend()Thread.Resume()这两个方法已经过时了。 为什么? 什么是其他替代品和任何例子?

您将需要使用AutoResetEvent EventWaitHandle。

假设你想做这样的事情( 注意 :不要这样做!):

 private Thread myThread; private void WorkerThread() { myThread = Thread.CurrentThread; while (true) { myThread.Suspend(); //Do work. } } public void StartWorking() { myThread.Resume(); } 

像其他人所说,这是一个坏主意。 尽管只在自己的线程上使用Suspend是相对安全的,但是当线程实际被挂起时,你永远无法弄清楚你是否正在调用Resume。 所以Suspend和Resume已经过时了。

相反,您想要使用AutoResetEvent:

 private EventWaitHandle wh = new AutoResetEvent(); private void WorkerThread() { while(true) { wh.WaitOne(); //Do work. } } public void StartWorking() { wh.Set(); } 

工作线程将等待等待句柄,直到另一个线程调用StartWorking。 它与Suspend / Resume的工作原理大致相同,因为AutoResetEvent只允许一个线程“恢复”。

好的选择都是通过线程达到一个很高兴等待的点。 暂停是危险的,因为它可以在线程锁定互斥锁时挂起线程 – 这是死锁的一个秘诀。

所以你的线程需要的是一个可以等待的ManualResetEvent – 当它没有持有任何锁时,它可以安全地执行。

这是Thread(C#)的最佳教程: http : //www.albahari.com/threading/

等待你需要在线程上使用.Join()。 这将等到胎面完成工作。 另外,你需要使用Wait / Pulse 。

那个太长了。 我需要的是一个快速的示例代码。 我在讨论中找到了一个,并由Mark R. Dawson在http://bytes.com/groups/net-c/458947-thread-suspend上回答。 它解释了过时方法的危险以及如何使用AutoResetEvent通知第二个线程继续处理。

您可以使用ManualReset而不是AutoReset:

 public class Worker { ManualResetEvent _shutdownEvent = new ManualResetEvent(false); ManualResetEvent _pauseEvent = new ManualResetEvent(true); Thread _thread; public Worker() { } public void Start() { _thread = new Thread(DoWork); _thread.Start(); Console.WriteLine("Thread started running"); } public void Pause() { _pauseEvent.Reset(); Console.WriteLine("Thread paused"); } public void Resume() { _pauseEvent.Set(); Console.WriteLine("Thread resuming "); } public void Stop() { // Signal the shutdown event _shutdownEvent.Set(); Console.WriteLine("Thread Stopped "); // Make sure to resume any paused threads _pauseEvent.Set(); // Wait for the thread to exit _thread.Join(); } public void DoWork() { while (true) { _pauseEvent.WaitOne(Timeout.Infinite); if (_shutdownEvent.WaitOne(0)) break; // Do the work.. Console.WriteLine("Thread is running"); } } } 

我同意这是一个很棒的教程。 Suspend()和Resume()过时的主要原因是因为它们是非常危险的方法。 在任何时候,线程t都可以做任何事情。 任何东西。 想象一下,你的线程正在读取文件并对其进行锁定。 你暂停你的线程。 文件保持锁定状态 任何其他资源也是如此。 锁定互斥锁也是如此。