有些時候我們在讓程序剛開始運行的時候完成一些初始化的工作,原來我也喜歡把這些代碼寫在窗體的Load事件中,但是我發現這樣做很不好,因為工作量較大,或者使用遠程數據庫的時候會發現程序啟動時會卡一下,用戶體驗很不好。
界面設計的原則,界面線程Don't do heav work。
后來我就把這些初始化的工作交給單獨的線程執行,發現效果很好。但是后來CLR弄了個線程安全的限制,界面控件不允許跨線程更改,當然你也可以關閉這個,使用:
在窗體的構造函數中加入這一句 Control.CheckForIllegalCrossThreadCalls = false; 子線程就可以直接訪問窗體中的控件了,不過這樣線程是非安全的. 而默認Control.CheckForIllegalCrossThreadCalls=true;(捕獲線程錯誤調用) 這時可以用Invoke
但是為了安全,不能這樣。
使用委托吧,這么多界面控件要更新,代碼累死人呀!
我就想到了System.Windows.Forms.Timer,這個更新界面可是安全的,但是問題也來了,它是通過Windows消息機制實現的,類似於VB或Delphi中的Timer控件,內部使用API SetTimer實現的。它的主要缺點是計時不精確,而且必須有消息循環,Console Application(控制台應用程序)無法使用。
不精確無所謂,控制台應用程序與我沒關系,可是必須循環就困難了,我想讓它只執行一次,就行了!
這個也簡單,執行完之后,Timer自毀。使用:
private void timer1_Tick(object sender, EventArgs e) { //初始化工作代碼 timer1.Enabled = false;
該方法有點小問題,看下面代碼 }
根據6樓 unkown 的意見(我剛剛測試過如果銷毀放在后面確實會出現問題)
也就是說你使用了timer 定時去在程序加載時更新主進程里的控件嗎? 在計時器被觸發的代碼中 應該是第一件是就去銷毀自己吧 再去更新控件!!
修改成如下:
在此感謝一下
private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; //初始化工作代碼 }
是不是很簡單,這只是自己想到的小技巧,算是拋磚引玉。更希望各位技術大牛能夠分享自己的技術與心得