可能重复的问题: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)
{
}
答案 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。