[英]Thread.Sleep and Painting UI
我有一個交通信號燈程序,可以在我住的地方模擬一個奇怪的路口。 我很確定我有邏輯。 我有代表燈所有可能狀態的函數,包括黃色。 問題是我的黃燈都沒有畫。 一輛汽車停下來亮起燈五秒鍾,並且沒有其他汽車通過綠燈后,用於適當照明的黃燈應該點亮三秒鍾,然后變綠。 由於某些原因,當我逐步執行程序時,沒有黃色的燈在畫。 這是我的代碼:
private void WaitThreeSecs()
{
//somehow I think this is to blame
int threeSeconds = 3000;
Thread.Sleep(threeSeconds);
}
private void FromStateOneToTwo()
{
//Stop Countdown Timers
fiveSec.Stop();
thirtySec.Stop();
//Indicate Current State
CurrentState = 2;
//Paint lights
BottomGreen.Fill = gray;
BottomYellow.Fill = yellow; // this never happens
BottomRed.Fill = gray;
//Wait 3 secs
WaitThreeSecs();
btnbottom.Content = "Car Stops";
//Call function that changes the state for other lights to be green
StateTwo();
}
五秒鍾后將調用FromStateOneToTwo(),但是指示燈永遠不會發黃。 我不知道為什么這種情況不會發生。 從按下按鈕到適當的燈從紅色直變為綠色,燈會等待8秒鍾,這意味着我的3秒鍾計時器正在工作,但我的繪畫燈卻沒有工作。 (我完全像在這里一樣畫其他功能,並且工作正常)
如果需要,我可以顯示更多/全部代碼。
您不會遇到跨線程InvalidOperation
異常,因此我假設所提供的函數在UI線程上運行。 如果您是通過單擊按鈕或DispatcherTimer
的已過去事件來調用它,則將發生這種情況。
通過休眠UI線程,您不必花時間畫屏幕。 它先切換顏色,然后再切換,而無需運行任何繪制方法。
最好的解決方案是使用標准Timer
這樣您就不必進入UI線程,然后使用Dispatcher.BeginInvoke
(WPF)或Control.Invoke
(WinForms)將對UI線程的更改編組。 您還可以消除Thread.Sleep
並增加計時器以觸發下一個更改。
在WaitThreeSecs()
強制刷新屏幕之前使用Application.DoEvents
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.