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

Dav*_*.ca 25 c# thread-safety .net-2.0

这两种方法Thread.Suspend()Thread.Resume()是因为.NET 2.0过时.为什么?什么是其他替代品和任何例子?

Dar*_*man 20

您将要使用AutoResetEvent EventWaitHandle.

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

private Thread myThread;

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

public void StartWorking() 
{
    myThread.Resume();
}
Run Code Online (Sandbox Code Playgroud)

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

相反,您想要使用AutoResetEvent:

private EventWaitHandle wh = new AutoResetEvent();

private void WorkerThread() 
{
    while(true) 
    {
        wh.WaitOne();
        //Do work.
    }
}

public void StartWorking()
{
    wh.Set();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这解决了典型的挂起/恢复情况,并避免了过时的警告. (2认同)

Dan*_*ker 11

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

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


Pat*_*ins 5

这是有史以来最好的 Thread 教程(用于 C#):http : //www.albahari.com/threading/

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