2015-05-15 104 views
2

有什麼辦法可以禁用任務內的windows.form.timer嗎?有什麼辦法可以禁用任務內的windows.form.timer嗎?

這裏是我有的示例代碼。

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Task.Factory.StartNew(() => {runTask();}); 
} 
private void runTask() 
{ 
    //Process here.... 
    timer1.enabled = false; 
    MessageBox.Show(timer1.Enabled.ToString()); 
} 

當我運行程序timer1.enabled的價值仍然是正確的。 反正有禁用任務內的計時器嗎?

+0

是的,但我會非常小心這裏的時間問題......比賽條件等等。我想我會發送一個自定義的消息到主線程,要求*他*禁用(基本上是「他的」...)計時器。讓主線程成爲處理用戶界面的[唯一...]一個線程。 。 。那樣,我認爲你會更開心。 –

+0

我會''調用'所有者窗體上的操作,但不應該有任何其他原因,爲什麼它不起作用。 –

+0

我似乎沒有得到這個概念。 :D,你能給我一段代碼請@RonBeyer 它會大大幫助我。謝謝 – Reyn

回答

2

禁用定時器工作得很好,你可以很容易地通過沒有得到一個屏幕的消息框告訴。這是你的測試代碼是問題,它有一個線程比賽錯誤。睡覺時也很容易看到:

private void runTask() { 
     //Process here.... 
     timer1.Enabled = false; 
     System.Threading.Thread.Sleep(100); 
     MessageBox.Show(timer1.Enabled.ToString()); 
    } 

您現在看到「False」。通過更改@ Ron的片段並使用BeginInvoke而不是Invoke可以看到完全相同的錯誤。

Timer類已經線程安全停止,不需要任何幫助。你可以從Reference Source看到它,注意PostMessage()的調用。然而,啓動定時器並不安全,工作線程不會運行調度程序循環,因此Tick事件不會觸發。

您沒有問題,請不要修復它。

+0

是的,調用只是通過(我認爲)在返回工作線程之前阻塞調用並在主線程上完成來避免問題 –

+0

is system.threading.thread.sleep()safe in inside inside a任務? – Reyn

+0

它不是不安全的,你只會失去優雅點,使用Task.Delay()代替 –

相關問題