timer和dispatchertimer功能效果完全一样对吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了timer和dispatchertimer功能效果完全一样对吗相关的知识,希望对你有一定的参考价值。

参考技术A DispatcherTimer类位于System.Windows.Threading命名空间下,类似于winform的Timer类。


DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += new EventHandler(timer_Tick);


void timer_Tick(object sender, EventArgs e)

tb.Text = DateTime.Now.ToLongTimeString();
本回答被提问者和网友采纳

C# 计时器用法(DispatcherTimerSystem.Timers.TimerSystem.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 

以上是关于timer和dispatchertimer功能效果完全一样对吗的主要内容,如果未能解决你的问题,请参考以下文章

Timer和DispatcherTimer简单使用

C# 计时器用法(DispatcherTimerSystem.Timers.TimerSystem.Threading.Timer)

无法创建 DispatcherTimer [重复]

dotnet 读 WPF 源代码 聊聊 DispatcherTimer 的实现

Xamarin.Android 使用Timer 并更改UI

WPF Timer 控件在哪里?