System.Windows.Forms.Timer定時器的“自毀”


有些時候我們在讓程序剛開始運行的時候完成一些初始化的工作,原來我也喜歡把這些代碼寫在窗體的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;
        //初始化工作代碼
}

  

是不是很簡單,這只是自己想到的小技巧,算是拋磚引玉。更希望各位技術大牛能夠分享自己的技術與心得


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM