<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .NET Framework中定時器timer的單線程與多線程使用講解

        來源:懂視網 責編:小采 時間:2020-11-27 22:37:46
        文檔

        .NET Framework中定時器timer的單線程與多線程使用講解

        .NET Framework中定時器timer的單線程與多線程使用講解:如果你需要使用規律的時間間隔重復執行一些方法,最簡單的方式是使用定時器(timer)。與下邊的例子相比,定時器可以便捷、高效地使用內存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T
        推薦度:
        導讀.NET Framework中定時器timer的單線程與多線程使用講解:如果你需要使用規律的時間間隔重復執行一些方法,最簡單的方式是使用定時器(timer)。與下邊的例子相比,定時器可以便捷、高效地使用內存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T

        如果你需要使用規律的時間間隔重復執行一些方法,最簡單的方式是使用定時器(timer)。與下邊的例子相比,定時器可以便捷、高效地使用內存和資源:

        new Thread (delegate() {
         while (enabled)
         {
         DoSomeAction();
         Thread.Sleep (TimeSpan.FromHours (24));
         }
         }).Start();
        

        這不僅僅會永久占用一個線程,而且如果沒有額外的代碼,DoSomeAction每天都會發生在更晚的時間。定時器解決了這些問題。

        .NET Framework 提供了 4 種定時器。下邊兩個類是通用的多線程定時器:

        (1)System.Threading.Timer
        (2)System.Timers.Timer
        另外兩個是專用的單線程定時器:

        (3)System.Windows.Forms.Timer (Windows Forms 的定時器)
        (4)System.Windows.Threading.DispatcherTimer (WPF 的定時器)
        多線程定時器更加強大、精確并且更加靈活,而單線程定時器對于一些簡單的更新 Windows Forms 和 WPF 控件的任務來說是安全的,并且更加便捷。

        1.多線程定時器Permalink

        System.Threading.Timer是最簡單的多線程定時器:它僅僅有一個構造方法和兩個普通方法(取悅于極簡主義者,還有本書作者!)。在接下來的例子中,一個定時器在 5 秒鐘之后調用Tick方法來打印 “ tick… “,之后每秒打印一次直到用戶按下回車鍵:

        using System;
        using System.Threading;
        
        class Program
        {
         static void Main()
         {
         // 首次間隔 5000ms,之后間隔 1000ms
         Timer tmr = new Timer (Tick, "tick...", 5000, 1000);
         Console.ReadLine();
         tmr.Dispose(); // 停止定時器并執行清理工作
         }
        
         static void Tick (object data)
         {
         // 這里運行在一個線程池線程上
         Console.WriteLine (data); // 打印 "tick..."
         }
        }
        
        

        之后可以通過調用Change方法來改變定時器的時間間隔。如果你希望定時器只觸發一次,可以指定Timeout.Infinite作為構造方法的最后一個參數。

        .NET Framework 在System.Timers命名空間下提供了另一個名字相同的定時器類。它只是封裝了 System.Threading.Timer,并在使用完全相同的底層引擎的前提下提供額外的便利。下面是增加功能的簡介:

        (1)實現了Component,允許用于 Visual Studio 的設計器中。
        (2)Interval屬性代替了Change方法。
        (3)Elapsed事件代替了回調委托。
        (4)Enabled屬性用于開始或停止定時器(默認值是false)。
        (5)Start和Stop方法,避免對Enabled屬性感到困惑。
        (6)AutoReset標識來指定是否為可重復的事件(默認為true)。
        SynchronizingObject屬性提供Invoke和BeginInvoke方法,用于在 WPF 和 Windows Forms 控件上安全調用方法。
        這有個例子:

        using System;
        using System.Timers; // 命名空間是 Timers 而不是 Threading
        
        class SystemTimer
        {
         static void Main()
         {
         Timer tmr = new Timer(); // 無需任何參數
         tmr.Interval = 500;
         tmr.Elapsed += tmr_Elapsed; // 使用事件代替委托
         tmr.Start(); // 開啟定時器
         Console.ReadLine();
         tmr.Stop(); // 停止定時器
         Console.ReadLine();
         tmr.Start(); // 重啟定時器
         Console.ReadLine();
         tmr.Dispose(); // 永久停止定時器
         }
        
         static void tmr_Elapsed (object sender, EventArgs e)
         {
         Console.WriteLine ("Tick");
         }
        }
        
        

        多線程定時器使用線程池來允許少量線程服務多個定時器。這意味著,回調方法或Elapsed事件每次可能會在不同的線程上觸發。此外,不論之前的Elapsed是否完成執行,Elapsed總是幾乎按時觸發。因此,回調方法或事件處理器必須是線程安全的。

        多線程定時器的精度依賴于操作系統,通常是在 10-20 ms 的區間。如果需要更高的精度,你可以使用本地互操作(native interop)來調用 Windows 多媒體定時器,可以讓精度提升到 1 ms。它定義在 winmm.dll 中,首先調用timeBeginPeriod來通知操作系統你需要更高的定時器精度,然后調用timeSetEvent來啟動多媒體定時器。當使用完成后,調用timeKillEvent停止定時器,最后調用timeEndPeriod通知操作系統你不在需要更高的定時器精度了。可以通過搜索關鍵字 dllimport winmm.dll timesetevent 在網上找到完整的例子。

        2.單線程定時器Permalink

        .NET Framework 提供了兩個定時器,為消除WPF 和 Windows Forms 應用程序的線程安全問題而設計:

        System.Windows.Threading.DispatcherTimer(WPF)
        System.Windows.Forms.Timer(Windows Forms)
        單線程定時器不是被設計成能在其特定的環境外工作的。例如,如果在 Windows 系統服務應用程序中使用 Windows Forms 定時器,Timer事件不會觸發!

        它們暴露的成員都像System.Timers.Timer一樣(Interval、Tick、Start和Stop),并且用法也類似。但是不同之處在于其內部是如何工作的。它們不是使用線程池來產生定時器事件,WPF 和 Windows Forms 定時器依賴于 UI 模型的底層消息循環機制(message pumping mechanism)。意味著Tick事件總是在創建該定時器的那個線程觸發,在通常的程序中,它也就是管理所有 UI 元素和控件的那個線程。這有很多好處:

        單線程計時器比較安全,對于更新 Windows Forms controls或者WPF這種簡單任務來說更方便。在WPF或Windows Forms中安全的調用方法的SynchronizingObject對象。
        單線程計時器是被設計成屬于他們執行環境的計時器,如果你在一個Windows服務應用程序中使用Windows Forms的Timer,timer 事件并不會被觸發,只有在對應的環境下才會被觸發。
        像System.Timers.Timer一樣,他們也提供了相同的成員(Interval,Tick,Start,Stop),但是他們內部的工作原理不同,WPF和Windows Forms的計時器使用消息循環機制來取代線程池產生消息的機制。

        你可以不必考慮線程安全。
        新的Tick在之前的Tick完成執行前不會觸發。
        你可以直接在Tick時間事件的處理代碼中更新 UI 控件,而不需要調用Control.Invoke或Dispatcher.Invoke。
        這聽起來好的難以置信,直到你意識到使用這些定時器的程序并不是真正的多線程,不會有并行執行。一個線程服務于所有定時器,并且還處理 UI 事件。這帶來了單線程定時器的缺點:

        除非Tick事件處理器執行的很快,否則 UI 會失去響應。
        這使得 WPF 和 Windows Forms 定時器僅適用于小任務,通常就是那些更新 UI 外觀的任務(例如,顯示時鐘或倒計時)。否則,你就需要多線程定時器。

        在精度方面,單線程定時器與多線程定時器類似(幾十毫秒),但是通常精度更低,因為它們會被其它 UI 請求(或其它定時器事件)推遲。

        單線程計時器基于Windows消息循環,應用程序會同步的處理計時器的消息。會發現UI界面相應速度比較慢。解決這個問題的方法是使用多線程計時器。
        單線程計時器的缺點:除非Tick事件的處理代碼執行的非常快,否則UI界面會變得響應很慢。所以 WPF和Windows Forms的計時器都非常適合小任務,尤其是界面更新的任務。例如時鐘和計數顯示。否則,你需要一個多線程計時器


        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .NET Framework中定時器timer的單線程與多線程使用講解

        .NET Framework中定時器timer的單線程與多線程使用講解:如果你需要使用規律的時間間隔重復執行一些方法,最簡單的方式是使用定時器(timer)。與下邊的例子相比,定時器可以便捷、高效地使用內存和資源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (T
        推薦度:
        標簽: net framework 定時器
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 精品熟女少妇AV免费观看| ww4545四虎永久免费地址| 免费成人av电影| 色天使色婷婷在线影院亚洲| 日韩免费一级毛片| 国产综合激情在线亚洲第一页| 国产香蕉九九久久精品免费| 精品国产日韩久久亚洲| 日韩av无码成人无码免费| 亚洲性无码一区二区三区| 青青青国产免费一夜七次郎| 国产亚洲精品美女久久久久| 亚洲国产精品国产自在在线| 好湿好大好紧好爽免费视频| 一本色道久久综合亚洲精品高清| 免费人成激情视频在线观看冫| 亚洲视频国产视频| 免费观看成人毛片a片2008| 免费亚洲视频在线观看| AV在线亚洲男人的天堂| 免费精品99久久国产综合精品| 亚洲av中文无码乱人伦在线咪咕| 中文字幕免费高清视频| 国产 亚洲 中文在线 字幕| 免费做爰猛烈吃奶摸视频在线观看 | 亚洲gay片在线gv网站| 日韩激情淫片免费看| 黄 色一级 成 人网站免费| 中文字幕亚洲第一在线| 午夜时刻免费入口| selaoban在线视频免费精品| 久久久久亚洲AV成人无码网站| 成人浮力影院免费看| 立即播放免费毛片一级| 亚洲AV无码久久精品色欲| 成人免费一级毛片在线播放视频| 羞羞漫画在线成人漫画阅读免费 | 久久久久国色AV免费观看性色 | 人妻在线日韩免费视频| 亚洲人成在线精品| 国产aⅴ无码专区亚洲av麻豆|