最近因为工作需要,写了一个小程序。
背景是这样的:
我有一个线程,要在系统有空闲的内存或者是特定的程序没有执行时开启;而条件不符合时处于阻塞状态。
一开始,我的代码是:
int checkInterval = 3000;
bool isStopped = false;
while (true)
{
if (IsSpiderHasToStop())
{
Console.WriteLine("spider wait....");
t.Suspend();
isStopped= true;
}
else if (isStopped)
{
Console.WriteLine("spider restart....");
t.Resume();
}
Thread.Sleep(checkInterval);
}
然而执行过程中出现:C# resume 线程不是用户挂起的, 无法使其继续
原因是:在执行了一次Resume之后,我没有将标记isStopped重新置为false。由此导致了Resume方法执行了多次。
其实,一种更好的做法是不要使用isStopped的判断标记,而是直接根据线程的状态进行判断。如下:
while (true)
{
if (IsSpiderHasToStop())
{
Console.WriteLine("spider wait....");
t.Suspend();
}
else if (t.ThreadState == ThreadState.Suspended)
{
Console.WriteLine("spider restart....");
t.Resume();
}
Thread.Sleep( checkInterval );
}
当然,线程的Suspend()和Resume()方法微软已经建议不要使用了,因为有可能会出现死锁,不过,这两个方法刚好可以简单地实现我的需求。所以就用啦。只不过,要当心!