沒有真正意義上做過winform的項目,在很多年前有過一段實習經歷,后來工作中只是寫過一些小工具用來輔助日常開發。
這幾天做一個winform界面的小程序,有顯示系統時間的需求,最簡單的做法是拖一個Timer控件,設置好間隔時間為1000毫秒,然后在Tick事件里給控件賦值,而且不用考慮線程回寫UI的問題。
在很早以前就聽說System.Windows.Forms下的Timer控件有記時不精准的情況,通過實際的觀察確實有丟秒的現象,雖然不是很嚴謹的程序,但還是有必要解決這個問題。
取而代之的是用System.Timers.Timer,手寫幾行代碼同樣也能達到效果。
System.Timers.Timer clock = new System.Timers.Timer(1000); clock.Elapsed +=timer_Elapsed; clock.AutoReset = true; clock.Enabled = true;
用該方法給界面控件賦值會提示跨線程操作UI的異常,.net提供了很便捷的方式來回寫控件,解決線程間通訊的問題。
Action<string> action = (x) => { this.lbClock.Text = x.ToString(); }; this.lbClock.Invoke(action, DateTime.Now.ToString("HH:mm:ss"));
用此控件運行很穩定,沒有丟秒的現象,問題解決。
