日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

System.Windows.Forms.Timer与System.Timers.Timer的区别

發布時間:2023/12/18 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 System.Windows.Forms.Timer与System.Timers.Timer的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    .NET Framework里面提供了三種Timer:

    • System.Windows.Forms.Timer
    • System.Timers.Timer
    • System.Threading.Timer

    VS.NET 2005默認只有一個Timer控件,但那是System.Forms.Timer控件.如果要使用System.Timers.Timer的控件,需要在工具箱上單擊右鍵,手動添加.

    添加的步驟:工具箱單擊右鍵->Add Item->找到命名空間是System.Timers.Timer的控件,將其選中,OK即可。

    這里簡單的介紹一下這兩種Timer的區別。

    System.Windows.Forms.Timer是使用得比較多的Timer,Timer Start之后定時(按設定的Interval)調用掛接在Tick事件上的EvnetHandler。在這種Timer的EventHandler中可 以直接獲取和修改UI元素而不會出現問題--因為這種Timer實際上就是在UI線程自身上進行調用的。也正是因為這個原因,導致了在Timer的 EventHandler里面進行長時間的阻塞調用,將會阻塞界面響應的后果。下面是一個簡單的例子:

    public class MainForm : Form
    {

    private void MainForm_Load(object sender, EventArgs e)
    {
    timer.Interval = 1000;
    timer.Tick += delegate(object o, EventArgs args)
    {
    DoWork();
    };
    timer.Start();
    }

    private void DoWork()
    {
    for (int i = 0; i < 10; i++)
    {
    System.Threading.Thread.Sleep(1000);
    }
    }
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
    }


    在這個例子中,DoWork方法里面將會阻塞10秒,在這10秒之內,UI將會失去響應。而通過使用System.Timers.Timer,就可 以解決這個問題。因為System.Timers.Timer是在.NET的Thread Pool上面運行的,而不是直接在UI Thread上面運行,所以在這種Timer的EventHandler里面進行耗時較長的計算不會導致UI失去響應。但是這里有兩個地方需要注意:

  • 因為一般來說System.Timers.Timer不是運行在UI Thread上面的,所以如果要在這種Timer的EventHandler里面更新UI元素的話,需要進行一次線程切換,在WinForm開發中一般通過UI元素的Invoke方法完成:

    private void DoWork()
    {
    for (int i = 0; i < 10; i++)
    {
    System.Threading.Thread.Sleep(1000);
    }
    this.Invoke(new UpdateUICallBack(UpdateUI));
    }

    private delegate void UpdateUICallBack();

    private void UpdateUI()
    {
    }

  • System.Timers.Timer有一個Property:SynchronizingObject?。如果設置了這個Property(一般是某個Form),那么之后對Timer掛接的EventHandler的調用將會在創建這個UI元素的線程上進 行(一般來說就是UI線程)。值得注意的是,如果你通過WinForm設計器把System.Timers.Timer拖放到Form上,那么這個 Property將會自動被設置。此時這種Timer就和System.Windows.Forms.Timer的效果一樣:長調用將會阻塞界面。
  • System.Windows.Forms.Timer
    1. 它是一個基于Form的計時器
    2. 創建之后,你可以使用Interval設置Tick之間的跨度,用委托(delegate)hook Tick事件
    3. 調用Start和Stop方法,開始和停止
    4. 完全基于UI線程,因此部分UI相關的操作會在這個計時器內進行
    5. 長時間的UI操作可能導致部分Tick丟失

    System.Timers.Timer
    1. 用的不是Tick事件,而是Elapsed事件
    2. 和System.Windows.Forms.Timer一樣,用Start和Stop方法
    3. AutoReset屬性決定計時器是不是要發起一次事件然后停止,還是進入開始/等待的循環。System.Windows.Forms.Timer沒有這個屬性
    4. 設置對于UI控件的同步對象(synchronizing object),對控件的UI線程發起事件


    這兩者與System.Threading.Timer的區別比較見http://mark.michaelis.net/Blog/SystemWindowsFormsTimerVsSystemThreadingTimerVsSystemTimersTimer.aspx,這里只摘錄最后的總結:
    System.Windows.Forms.Timer 是對于用戶界面編程的比較顯然的選擇。而另外兩個之間的選擇就不是很明顯。如果必須在IContainer內,那么就應該選擇 System.Timers.Timer。如果沒有用到System.Timers.Timer的特性,那么建議選擇 System.Threading.Timer,因為它稍稍輕量級一些。

    Timer 是先等待再執行,如果我們要達到先執行再等待的效果,設置 默認時間間隔Interval?=100,或者更少為1(不能為0),之后再引發事件內更改 時間間隔Interval 為想要的值。

    轉自:http://www.cnblogs.com/lonelyxmas/archive/2009/10/27/1590604.html

    總結

    以上是生活随笔為你收集整理的System.Windows.Forms.Timer与System.Timers.Timer的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。