2010-06-12 64 views
8

我正在使用BackgroundWorker通過在循環內調用WebClient.DownloadString來下載一些網站。我希望用戶在下載內容時取消選擇,所以無論何時我發現CancellationPending在循環中間打開,我都會調用CancelAsync如何暫停BackgroundWorker?或類似的東西

但現在我注意到函數DownloadString有時會凍結,所以我決定使用DownloadStringAsync來代替(所有這些都在使用BackgroundWorker創建的其他線程中)。由於我不想通過在調用DownloadStringAsync之後退出循環和函數來重寫我的整個代碼,所以在調用它之後我做了一個while循環,它什麼都不做,只是檢查一個變量bool StopDownloadStringCompleted事件處理程序被調用或當用戶請求取消操作時。

現在,奇怪的是,它在調試版本上正常工作;但是在發行版中,程序在while循環中凍結,就像它是主線程一樣。

回答

4

聽起來你很忙 - 等待一段時間。你應該使用事件信號,例如。一個WaitHandle。釋放模式下的忙碌等待循環可能會消耗掉所有的CPU,給人一種凍結的感覺。

在DownloadStringCompleted中指示WaitHandle,或者用戶取消下載。

檢查WaitHandle類上的MSDN docs。那裏也有一個例子。

+0

WaitHandle的作品完美。謝謝! – Juan 2010-06-12 17:38:58

+0

在後臺工作暫停/恢復循環http://stackoverflow.com/questions/8359058/pause-resume-loop-in-background-worker – 2012-12-31 01:40:12

0

發送您的while循環檢查取消睡眠一會兒(幾毫秒)。這充分釋放了其他線程和進程的CPU運行時間。

+1

忙碌的等待是不好的做法。 – 2010-06-12 08:35:06

+0

我知道,我不知道在C#/ .Net中有什麼像WaitHandle的東西(總是要學習新東西:-)),但有時輪詢是唯一的解決方案,然後應該確保只進行輪詢檢查一次,然後放棄OS時間(在Linux中它的yield()函數)給線程/進程。 – Mark 2010-06-12 08:43:59

+0

WaitHandles也可以用於超時,這樣可以防止輪詢:)(而且我用我的份額忙等待,直到我明智..嘿嘿) – 2010-06-12 09:43:32

0

不錯的話題,我用 在我的後臺工作進程的雙重同時

int icounter = 1; 
while (icounter < SomeListInventory.Count) 
      { 
       while (pauseWorker == false) 
       { 
        //----------------------- 
        //DO SOME WORK 
         icounter++; 
        //----------------------- 
       } 
      } 

,我有一個按鈕暫停,當我按下它,pauseWorker(全局變量或屬性)爲真,並在循環第一次,而不增加icounter,當我再次使pauseworker = false的過程繼續

相關問題