3

可能重复的问题: 有没有办法无限期地暂停一个线程?


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

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

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

然后我得到下面的异常,因为我在它没有被暂停时调用了 resume。

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

4 回答 4

7

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

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

1)监视器,等待()和脉冲()

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

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


将在您的问题中插入一个链接,虽然我不认为它是重复的,但那里接受的答案非常适合治愈您使用暂停/恢复。

于 2009-09-02T18:07:38.870 回答
2

WaitHandles 在这里是一种更好的方法。

与其挂起你的线程,不如让它等待一个等待句柄。当您准备好再次启动时,您可以从另一个线程“设置”句柄。

有关代码示例,请参阅MSDN 的 ManualResetEvent 文档

于 2009-09-02T18:13:00.047 回答
0

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

于 2009-09-02T17:59:35.470 回答
0

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

于 2009-09-02T18:07:18.747 回答