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()方法微軟已經建議不要使用了,因爲有可能會出現死鎖,不過,這兩個方法剛好可以簡單地實現我的需求。所以就用啦。只不過,要當心!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章