C# 计时器用法(DispatcherTimer、System.Timers.Timer、System.Threading.Timer)

首先,我觉得三种计时器最大的区别是:DispatcherTimer触发的内容会直接转到主线程去执行(耗时操作会卡住主线程),另外两个则是在副线程执行,如果需要修改界面,则需要手动转到主线程。

DispatcherTimer:

        DispatcherTimer _timer;
        public void TestDispatcherTimer()
        {
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(1);
            _timer.Tick += _timer_Tick;
            _timer.Start();
        }
        private void _timer_Tick(object sender, EventArgs e)
        {
            try
            {
                Trace.WriteLine("Test DispatcherTimer");
                _timer.Stop();
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Error");
                _timer.Stop();
                _timer.Start();
            }
        }        

System.Timers.Timer:

        System.Timers.Timer _timer;
        public void TestTimersTimer()
        {
            _timer = new System.Timers.Timer();
            _timer.Interval = 1000; //单位毫秒
            _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
            _timer.Start();
        }

        private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                Trace.WriteLine("Test System.Timers.Timer");
                #region 此处展示的是把副线程的内容转到主线程
                System.Windows.Application.Current.Dispatcher.Invoke(
                         new Action(() =>
                         {
                             Trace.WriteLine("同步切换");
                         }));
                System.Windows.Application.Current.Dispatcher.BeginInvoke(
                         new Action(() =>
                         {
                             Trace.WriteLine("异步切换");
                         }));
                #endregion
                _timer.Stop();
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Error");
                _timer.Stop();
                _timer.Start();
            }
        }

System.Threading.Timer:

        System.Threading.Timer _timer;
        private void TeseThreadingTimer()
        {
            _timer = new System.Threading.Timer(new System.Threading.TimerCallback(Out), null, 0, 1000); //各参数意思详见:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.timer?redirectedfrom=MSDN&view=netframework-4.8
        }
        private void Out(object sender)
        {
            try
            {
                Trace.WriteLine("Test System.Threading.Timer");
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Error");
            }
        }
        private void Stop()
        {
            _timer.Dispose();
        }

此处个人无关记载:Environment.TickCount

原文地址:https://www.cnblogs.com/zebra-bin/p/11164703.html

时间: 2024-07-29 20:07:56

C# 计时器用法(DispatcherTimer、System.Timers.Timer、System.Threading.Timer)的相关文章

C#-Forms.Timer、Timers.Timer、Threading.Timer的比较和使用

在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHa

Forms.Timer、Timers.Timer、Threading.Timer的研究

.NET Framework里面提供了三种Timer System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer 一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可

問題排查:沒有任何多載符合 System.Timers.ElapsedEventHandler 委派

這是在實作當前專案最後一個關鍵功能:提醒通知 所遇到的奇怪狀況 目前的設想,是以 Windows Form 結合 Timer,當作發送通知的載體 大家都知道在 C# 的環境裡,有三種內建的 Timer 可用:Windows Form Timer.System.Timer.Threading.Timer 遇到的怪事,主要是在 System.Timer 這一段 代碼如下: using System; using System.Drawing; using System.Text; using Sys

System.Timers.Timer用法

System.Timers.Timer t = new System.Timers.Timer(5000); //设置时间间隔为5秒 private void Form1_Load(object sender, EventArgs e)        {            t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_TimesUp);            t.AutoReset = false; //每到指定时间Elap

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer

System.Windows.Forms.Timer.System.Timers.Timer.System.Threading.Timer的 区别和用法System.Windows.Forms.Timer执行的时候,如果你在过程中间加一个sleep整个的界面就死掉了,但是另外两个没有这个情况,System.Timers.Timer.System.Threading.Timer!System.Timers.Timer.System.Threading.Timer这两个平时用的时候没有发现太大的区别

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨

.NET System.Timers.Timer的原理和使用(开发定时执行程序)

概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔.然后可以操控此事件以提供定期处理.例如,假设您有一台关键性服务器,必须每周7 天.每天24 小时都保持运行.可以创建一个使用Timer 的服务,以定期检查服务器并确保系统开启并在运行.如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员. 基于服务器的Timer 是为在多线程环境中用于辅助线程而设计的.服务器计时器可以在线程间移动来处理引发的Elapsed 事件,这样

C# System.Timers.Timers的用法在工控设备上位中的用法

这两天写设备的上位,由于要读取服务器上的数据库,通过WEBSERVICE访问数据库,我具体的做法是: 1.专门用Timer起线程执行,由于在用的时候报错,不能访问其他线程资源的错误,因此我用了委托的方法解决,是从网上看的说是可以解决,代码如下: timer1 = new System.Timers.Timer();                        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed); private v

使用System.Timers.Timer类实现程序定时执行

使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和System.Timers.Timer类. System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Consol