有些時候我們在讓程式剛開始啟動並執行時候完成一些初始化的工作,原來我也喜歡把這些代碼寫在表單的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; //初始化工作代碼}
是不是很簡單,這隻是自己想到的小技巧,算是拋磚引玉。更希望各位技術大牛能夠分享自己的技術與心得