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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计时器

發布時間:2024/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计时器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
.net提供4種計時器,2種通用多線程計時器 System.Threading.Timer System.Timers.Timer

2種專用單線程計時器

System.Windows.Forms.Timer (Windows Forms timer)

System.Windows.Threading.DispatcherTimer (WPF timer) 多線程計時器更加精確靈活,單線程計時器更安全和方便,特別是對于簡單的任務比如更新窗體控件之類的。 System.Threading.Timer是最簡單的多線程計時器:它只有一個構造器和2個方法。看下面的例子。一個計時器5秒后調用Tick方法,然后每秒調用一次,直到用戶按回車。 static void Main() { // First interval = 5000ms; subsequent intervals = 1000ms Timer tmr = new Timer(Tick, "tick...", 5000, 1000); Console.ReadLine(); tmr.Dispose(); // This both stops the timer and cleans up. } static void Tick(object data) { // This runs on a pooled thread Console.WriteLine(data); // Writes "tick..." } 你可以改變間隔時間,如果你只想調用一次,只需指定Timeout.Infinite作為構造方法的最后一個參數。 .NET Framework提供另一個計時器類。它簡單包裹了System.Threading.Timer,并且額外提供一些功能: 是一個控件 Interval屬性代替了Change方法 Elapsed事件代替了回調委托 Enabled屬性來啟動和停止計時器 Start和Stop方法,如果你被Enabled屬性混淆了的話 AutoReset標志表示一個循環事件 一個SynchronizingObject屬性帶有Invoke和BeginInvoke方法,用來安全的調用WPF元素和Windows Form控件。 看下面的例子。 using System; using System.Timers; // Timers namespace rather than Threading class Program { static void Main() { Timer tmr = new Timer(); // Doesn't require any args tmr.Interval = 500; tmr.Elapsed += tmr_Elapsed; // Uses an event instead of a delegate tmr.Start(); // Start the timer Console.ReadLine(); tmr.Stop(); // Stop the timer Console.ReadLine(); tmr.Start(); // Restart the timer Console.ReadLine(); tmr.Dispose(); } static void tmr_Elapsed(object sender, EventArgs e) { Console.WriteLine("Tick"); } }

多線程計時器使用的是線程池,這意味著回調方法或者Tick事件可能每次由不同的線程調用,此外,每次都很準時,不管先前一次Tick是否已經執行完成。因此回調或者事件必須是線程安全的。

多線程timer的精確性依靠于操作系統,通常有10-20ms的誤差。如果想要更高級別的精確性,你就需要用本地interop,并且調用Windows multimedia timer。這個的精確性在1ms之內,它定義在winmm.dll中。

NET Framework 提供了計時器來為WPF和Winform消除線程安全問題。

? System.Windows.Threading.DispatcherTimer (WPF)

? System.Windows.Forms.Timer (Windows Forms)

單線程Timer應該在他們各自的環境中運行,如果你使用Winform計時器在Windows ?Service Application,Timer事件不會被觸發。

這些類暴露出來的方法和System.Timers.Timer的用法相似,但是不同在于內部的執行原理。不是使用線程池產生計時器事件,WPF和WinForm計時器依靠消息泵機制來作為他們的接口模型。這意味著Tick事件總是觸發在初始創造這個計時器的線程上,在通常的應用程序中,也是同一個線程管理用戶接口元素和控件的。這樣設計有很多好處:

不需要在擔心線程安全

前一個Tick不完成,后一個Tick不開始。

可以在Tick事件中直接更新用戶控件,而不需要Control.Invoke或者Dispatcher.Invoke。

聽起來都不錯,但是程序使用此類計時器不是真正的多線程,沒有并行執行,一個線程服務于所以的計時器,包括UI事件。這就有缺點,除非Tick事件處理的很快,不然的話用戶界面可能無響應。

這些控件適合在WPF和WinForm中的小工作,比如更新用戶界面方面,類似時鐘,倒計時等。不然,你還是需要一個多線程計時器,在精確性方面,單線程Timer和多線程Timer類似,10ms左右,盡管單線程Timer稍微不如多線程Timer精確,這是因為它們可能由于用戶界面請求或者Timer事件處理而延遲。

?

?

?

?

?

?












本文轉自cnn23711151CTO博客,原文鏈接:http://blog.51cto.com/cnn237111/536247?,如需轉載請自行聯系原作者



超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的计时器的全部內容,希望文章能夠幫你解決所遇到的問題。

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