2012-06-25 173 views
0

我有一個週期性運行10秒的任務。我通過閱讀數據庫來做一些picturebox刷新過程。我想要的是調用或喚醒線程,並執行刷新操作,當我點擊一個按鈕immidiately。總之,我希望刷新任務不僅受時間驅動,而且還受到事件的共同驅動。這可能嗎?如果是,如何?下面顯示了該任務的代碼塊。睡覺時喚醒任務

while (true) 
{ 
    // do some refresh operation 
    Thread.Sleep(10000); 
} 

void button1_Click(object sender, EventArgs e) 
{ 
    // invoke or awaken thread 
} 
+0

不能與這個while循環 - 基本與Thread.Sleep你告訴Windows - 不要安排在未來10秒的線程。我不知道有什麼辦法讓它回來。您可以減少時間間隔並檢查循環內的變量。 – Bond

+0

使用定時器控制!它是爲此而構建的。您甚至可以避免執行多線程操作,因爲tick事件將在UI線程中觸發。 –

+0

我不明白的是:假設計時器更新了圖形用戶界面,然後在5秒鐘後單擊按鈕進行另一次手動更新。定時器應該在5秒後運行自己的更新還是停止直到下一回合? – Tudor

回答

4

首先,我勸你放下Thread + Sleep + Invoke組合的定時操作。這很醜陋。 WinForms和WPF都有定時器類來自動執行這三件事(定期從調度程序線程更新GUI)。請查看System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer

現在爲您的具體問題,您可以簡單地定義一個常用的方法來更新您需要的GUI,並從計時器代碼和按鈕處理程序中調用它。

0

創建AutoResetEvent

protected AutoResetEvent _threadCycle; 
_threadCycle = new AutoResetEvent(false); 
當你想等做

_threadCycle.WaitOne(delay, false); 

,當你想設置的情況下,有效地讓線程繼續:

_threadCycle.Set(); 

獎勵:

當你做_threadCycle.WaitOne(delay, false);時,你將得到一個返回值truefalse,你可以檢查超時是否過期或者你是否因手動設置的事件而繼續。

BTW:

如果你正在做你的任務在備用線程只會工作。如果你使用主線程,無論如何你都會等待超時完成。也許這將是最好的使用@Tudors的答案,並獲得這個選項只是'通過刺'的方式。

0

您應該爲此使用AutoResetEvent。

你做的是一樣的東西(假設你的AutoResetEvent被稱爲 '信號'):

while (true) 
{ 
    signal.WaitOne(10000); 
    ... 
} 

而在你的按鈕處理程序,只是做:

signal.Set();