2011-07-24 48 views
1

在我的計劃,將有一段時間,我都打電話如何恢復/中斷的BackgroundWorker線程

Thread.Sleep(Timeout.Infinite); 

爲「暫時停止」 BackgroundWorker的。在背景工作者線程睡眠之前將顯示一個組框。該groupbox有一個按鈕,應該喚醒backgroundworker線程並繼續它。

如果我調用了Thread.interrupt()(其中的方式,我似乎無法使用,除非我創建一個Thread對象,我不應該這樣做)在button_Click事件,如:

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread.Interrupt(); //interrupt thread 
    } 

它會「中斷」的線程是UI線程,對嗎?我需要做的是中斷BackgroundWorker線程。我該怎麼做呢?

編輯:感謝那些回答了這個問題。我將使用AutoResetEvent。似乎更適合我的使用。

回答

3

讓我先從高層次的概念:

你應該做的是有你檢查每一個這樣的令牌通常在由BackgroundWorker執行的代碼中。當令牌被設置時,後臺代碼將停止正常流程,並且只需立即檢查令牌,當令牌被清除後,後臺代碼可以繼續處理。

所以上面有趣的部分是令牌。我會做的是可能有一個布爾值,我檢查,當布爾值設置爲true我會通過等待ManualResetEvent阻止線程。如果要恢復處理,請將布爾值設置爲false,並使用ManualResetEvent的Set()方法釋放以允許代碼繼續。

+0

謝謝你的回覆。所以我應該使用這個ManualResetEvent而不是Thread.Sleep();? –

+1

是的 - 您在示例中調用Thread.Sleep的位置將其替換爲您在ManualResetEvent上對WaitOne的調用。然後在按鈕處理程序中調用ManualResetEvent的Set以釋放線程。您可能還想考慮AutoResetEvent是否更適合您的需求(即當等待的線程已被釋放時,它會自動重置爲無信號狀態) – IanR

+0

信號量NirMH發佈真的很有幫助。那與ManualResetEvent有什麼不同?看起來他們使用的是相同的。在這種情況下哪個更好? –

2

你必須看看ManualResetEvent

用法:

ManualResetEvent e = new ManualResetEvent(false); //global variable 
e.WaitOne(); // Thread will wait until event is triggered 
e.Set(); // Trigger event from other thread 
0

您應該使用信號量來在線程之間進行同步。

一度想要的背景工人「休眠」,虎視眈眈的信號量的句柄,一旦你點擊「喚醒」按鈕,釋放信號量和後臺工作人員將繼續..

從你GUI線程(即顯示該按鈕的一個),你應該在後臺輔助線程上宣佈

Semaphore s = new Semaphore(0, 1); 

- 這種說法初始化一個信號爲0(鎖定)

您BackgroundWorker的線程/代碼默認值致電:

s.WaitOne(); 

這種說法實際上導致後臺工作要等到信號燈由GUI線程(你的喚醒按鈕)公佈。

按鈕單擊處理程序,調用:

s.Release(); 

釋放操作允許後臺工作的代碼來恢復運行。

+0

謝謝!正是我需要的!易於使用! –