2011-05-20 67 views
3

在我的應用我覺得需要有無窮的while循環主要是做一些重複的動作時間可持續,除非另一個事件發生這樣我在做什麼辦法就是正確處理來自無限循環退出在C#

while(chkFlag) 
{ 
    //do something here which takes around 30 seconds 
} 

然後,在其他一些事件說按下一個按鈕來停止循環我做

chkFlag = false; 

現在這樣做的工作,但問題是,這並不立即停止循環的chkFlag只的完整執行後檢查循環發生。那麼,任何人都可以告訴我,我可以基於事件立即退出一個循環。

+0

你在說什麼類型的事件? – mellamokb 2011-05-20 03:50:21

回答

4

「阻塞」代碼應該可能被轉移到某種工作線程(可以被終止和/或丟棄結果)。如果使用BackgroundWorker(建議,因爲它使這很簡單),有內置的支持來處理取消操作。

然後,循環既可以在BackgroundWorker中移動,也可以由工作人員的完成(RunWorkerCompleted)事件觸發下一個工人啓動(這會導致隱式循環)。

快樂編碼。


有終止/信令線程的多個「攻擊性」的方法;但建議這些需要比現在更多的信息。

+0

我忘了告訴我在一個線程中運行這個,該死的我忘了它自己,只是簡單地調用thread.abort做的伎倆。(除了課程) – swordfish 2011-05-20 05:39:46

+0

@swordfish請記住,Thread.Abort可能非常危險,取決於。 – 2011-05-20 05:58:00

1

您正在尋找break;

我想,基於匿名downvoter,我應該詳細說明。上面的語法將立即退出您所在的循環(它也可以在其他循環中工作;可能值得注意的是continue存在以重新開始循環,這將在for樣式循環中執行遞增邏輯)。

您決定執行break的方式取決於您,但它必須位於循環內部。

有多種方法可以解決這個問題,比如在循環中放置事件檢查,並在發生時調用break;。其他人已經注意到BackgroundWorkers和Cancel Tokens的其他方法(由於它不在循環內,所以這是首選)。

+0

在循環中散佈break語句對我來說似乎不是一個好主意,這就是爲什麼我在這裏問它。 – swordfish 2011-05-20 05:39:01

+0

夠公平的。我剛剛讀了這個問題,並誤以爲你不知道'break'。這主要是我發佈它的原因。 – pickypg 2011-05-20 05:52:38

1

你不能立即退出(好吧,你可以在新線程中運行循環,如果在任何時候真的有安全的拋出異常),但你可以分散if(!chkFlag) break;在循環內的各個點都可以安全退出。通常的做法是使用BackgroundWorkerCancellationToken而不是簡單的布爾標誌。

當然,它仍然需要在另一個線程中運行,以便按鈕事件可以運行。 BackgroundWorker會自動處理這個問題。

0

是否有可能您想使用新的線程?你在循環中做了30秒什麼。聽起來像是也許有一個更好的設計使用。

您是否考慮過使用計時器,或設置事件處理程序?