C# resume 線程不是用戶掛起的, 無法使其繼續
最近因爲工作需要,寫了一個小程序。
背景是這樣的:
我有一個線程,要在系統有空閒的內存或者是特定的程序沒有執行時開啓;而條件不符合時處於阻塞狀態。
一開始,我的代碼是:
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()方法微軟已經建議不要使用了,因爲有可能會出現死鎖,不過,這兩個方法剛好可以簡單地實現我的需求。所以就用啦。只不過,要當心!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.