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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#的四种Timer介绍

發(fā)布時間:2025/7/14 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#的四种Timer介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

一.Timer的幾個類別

  1.System.Threading.Timer

  2.System.Timers.Timer

  3.System.Windows.Forms.Timer

  4.System.Windows.Threading.DispatcherTimer

二.System.Threading.Timer

  他的源代碼里是這樣寫的:

public sealed class Timer : MarshalByRefObject, IDisposable {// Fieldsprivate TimerHolder m_timer;private const uint MAX_SUPPORTED_TIMEOUT = 0xfffffffe;// Methods [MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical]public Timer(TimerCallback callback);[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical, __DynamicallyInvokable]public Timer(TimerCallback callback, object state, int dueTime, int period);[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical]public Timer(TimerCallback callback, object state, long dueTime, long period);[MethodImpl(MethodImplOptions.NoInlining), SecuritySafeCritical, __DynamicallyInvokable]public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period);[MethodImpl(MethodImplOptions.NoInlining), CLSCompliant(false), SecuritySafeCritical]public Timer(TimerCallback callback, object state, uint dueTime, uint period);[__DynamicallyInvokable]public bool Change(int dueTime, int period);public bool Change(long dueTime, long period);[__DynamicallyInvokable]public bool Change(TimeSpan dueTime, TimeSpan period);[CLSCompliant(false)]public bool Change(uint dueTime, uint period);[__DynamicallyInvokable]public void Dispose();public bool Dispose(WaitHandle notifyObject);internal void KeepRootedWhileScheduled();[SecurityCritical]internal static void Pause();[SecurityCritical]internal static void Resume();[SecurityCritical]private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark); }

   主要有四個參數(shù)。

  CallBack,一個返回值為void,參數(shù)為object的委托,也是計時器執(zhí)行的方法。

 ?? state,計時器執(zhí)行方法的的參數(shù)。

   dueTime,調(diào)用 callback 之前延遲的時間量(以毫秒為單位)。

   period,調(diào)用 callback 的時間間隔。

  例:System.Threading.Timer?tm=new System.Threading.Timer(Tick_tick,null,10000,20000);//10秒后開始計時,20秒后調(diào)用Tick_tick事件。

  特點:多線程計時器,精確,而且可擴展性強。

三.System.Timers.Timer

  在Reflector里反射出來的源代碼:

public Timer();public Timer(double interval);public void BeginInit();public void Close();protected override void Dispose(bool disposing);public void EndInit();[SuppressUnmanagedCodeSecurity, DllImport("kernel32.dll")]internal static extern void GetSystemTimeAsFileTime(ref FILE_TIME lpSystemTimeAsFileTime);private void MyTimerCallback(object state);public void Start();public void Stop();private void UpdateTimer();// Properties[Category("Behavior"), TimersDescription("TimerAutoReset"), DefaultValue(true)]public bool AutoReset { get; set; }[Category("Behavior"), TimersDescription("TimerEnabled"), DefaultValue(false)]public bool Enabled { get; set; }[Category("Behavior"), TimersDescription("TimerInterval"), DefaultValue((double) 100.0), SettingsBindable(true)]public double Interval { get; set; }public override ISite Site { get; set; }[Browsable(false), DefaultValue((string) null), TimersDescription("TimerSynchronizingObject")]public ISynchronizeInvoke SynchronizingObject { get; set; }

  BeginInit(),初始化。

  AutoReset,只執(zhí)行一次或重復(fù)執(zhí)行。

  enabled,獲取或設(shè)置一個值,該值指示 Timer 是否應(yīng)引發(fā) Elapsed 事件。

  Interval,相應(yīng)間隔時間。

  Elapsed綁定響應(yīng)事件。

  例:

public MainWindow(){InitializeComponent();System.Timers.Timer timer = new System.Timers.Timer();timer.AutoReset = true;timer.Enabled = true;timer.Interval=10000;timer.Elapsed += timer_Elapsed;timer.Start();}void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e){MessageBox.Show("響應(yīng)事件");}

?  特點:相對System.Threading.Timer進行了簡單包裝。多線程計時器

  實現(xiàn)了Component,所以可以在設(shè)計器顯示。代替Change方法的一個Interval屬性代替callback委托的一個Elapsed事件啟動和停止timer的Enabled屬性,默認是false。

  為了避免Enabled造成混亂,提供了Start和Stop方法。是否在每次指定的間隔結(jié)束時引發(fā)Elapsed時間,還是僅間隔第一次結(jié)束后運行的AutoReset屬性。

四.差異

  (1)上述兩個Timer都是多線程計時器。Timer每到間隔時間后就會激發(fā)響應(yīng)事件,因此要申請線程來執(zhí)行對應(yīng)的響應(yīng)函數(shù),Timer將獲取線程的工作都交給了線程池來管理,

  每到一定的時間后它就去告訴線程池:“我現(xiàn)在激發(fā)了個事件要運行對應(yīng)的響應(yīng)函數(shù),麻煩你給我向操作系統(tǒng)要個線程,申請交給你了,線程分配下來了你就運行我給你的響應(yīng)函數(shù),

  沒分配下來先讓響應(yīng)函數(shù)在這兒排隊(操作系統(tǒng)線程等待隊列)”,消息已經(jīng)傳遞給線程池了,Timer也就不管了,因為它還有其他的事要做(每隔一段時間它又要激發(fā)事件),

  至于提交的請求什么時候能夠得到滿足,要看線程池當(dāng)前的狀態(tài),如果線程滿了就排隊,在有空線程時就會響應(yīng)函數(shù)。否則就直接響應(yīng)。

  (2)而下述兩個是單線程計時器,其工作機制也和上面不同。計時器使用消息循環(huán)機制來取代線程池產(chǎn)生消息的機制。

  這意味著Tick事件總是在創(chuàng)建timer的那個線程上執(zhí)行,同時也意味著如果上一個Tick消息還未被處理,即使時間超過了間隔時間,在消息循環(huán)中也只存在一個Tick消息。

  下面是它們的優(yōu)點:

  你可以忘記線程安全。一個Tick事件在前一個Tick事件被處理完畢前不會被觸發(fā)。你可以直接在Tick事件處理代碼中更新控件,不需要調(diào)用Control.Invoke或Dispatcher.Invoke.

五.System.Windows.Forms.Timer

  專門適用于WindowForm,單線程使用。由于單線程計時器基于Windows消息循環(huán),應(yīng)用程序會同步的處理計時器的消息。UI界面會相對響應(yīng)速度很慢。

  WinForm不常用,就不寫了。

六.System.Windows.Threading.DispatcherTimer

  Reflector的源代碼方法

public DispatcherTimer();public DispatcherTimer(DispatcherPriority priority);public DispatcherTimer(DispatcherPriority priority, Dispatcher dispatcher);public DispatcherTimer(TimeSpan interval, DispatcherPriority priority, EventHandler callback, Dispatcher dispatcher);private object FireTick(object unused);private void Initialize(Dispatcher dispatcher, DispatcherPriority priority, TimeSpan interval);internal void Promote();private void Restart();public void Start();public void Stop();// Propertiespublic Dispatcher Dispatcher { get; }public TimeSpan Interval { get; set; }public bool IsEnabled { get; set; }public object Tag { get; set; } }

  類似于System.Threading.Timer

  例:

public MainWindow(){InitializeComponent();Timer.Interval = TimeSpan.FromSeconds(1000);Timer.IsEnabled = true;Timer.Tick += Timer_Tick;}void Timer_Tick(object sender, EventArgs e){throw new NotImplementedException();}private DispatcherTimer Timer;

?

六.寫在最后

  新手學(xué)習(xí)總結(jié),輕噴輕拍。寫的不一定全對,有錯歡迎糾正。

  文中有多處借鑒自:iloli的專欄?

  

?

  

?

?

?

?

  

轉(zhuǎn)載于:https://www.cnblogs.com/Khan-Sadas/p/4953446.html

總結(jié)

以上是生活随笔為你收集整理的C#的四种Timer介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。