恢复C#线程

时间:2009-09-02 17:57:43

标签: c# .net multithreading resume suspend

可能重复的问题:Is there a way to indefinitely pause a thread?


在我的代码中,我执行以下操作

Thread mainThread
//...
mainThread.Resume();

void StartThread()
{
    while (!wantQuit)
    {
        db.runEmail();
        mainThread.Suspend();
    }
}

然后我得到下面的例外情况,因为我在没有暂停的情况下调用简历。

System.Threading.ThreadStateException

我注意到了这个警告

warning CS0618: 'System.Threading.Thread.Resume()' is obsolete: 'Thread.Resume has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202'

所以我想知道有没有办法恢复并忽略它没有被暂停的异常/案例?我讨厌写下面而不只是一行

        try
        {
            mainThread.Resume();
        }
        catch (System.Threading.ThreadStateException e)
        {
        }

4 个答案:

答案 0 :(得分:7)

简单的解决方案是修复逻辑,不要在没有Suspended()时调用Resume()。

但Resume / Suspend API确实已被弃用,请看一下,例如:

1)Monitor,Wait()和Pulse()

2)AutoResetEvent或ManualResetEvent,Set()和WaitOne()

静态类Monitor更容易使用并与lock() {}集成,但是ResetEvent在这里可能更合适,因为你可以在set或unset模式下创建它并且你不太可能“错过”a信号。相比之下,当稍后发生Wait()时,Monitor.Pulse()将会丢失。


在您的问题中会插入一个链接,虽然我不认为它是重复的,但the accepted answer很适合用来阻止您使用暂停/恢复。

答案 1 :(得分:2)

WaitHandles是一种更好的方法。

不要暂停你的线程,而是等待等待句柄。当您准备好再次启动时,您可以从另一个线程“设置”句柄。

有关代码示例,请参阅MSDN's documentation of ManualResetEvent

答案 2 :(得分:0)

在这种情况下,您可能需要查看使用线程监视器。

答案 3 :(得分:0)

您可以在恢复前检查Thread.ThreadState并检查ThreadState.Suspended