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

來源:互聯網
上載者:User

有些時候我們在讓程式剛開始啟動並執行時候完成一些初始化的工作,原來我也喜歡把這些代碼寫在表單的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;        //初始化工作代碼}

  

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.