码迷,mamicode.com
首页 > Windows程序 > 详细

简述System.Windows.Forms.Timer 与System.Timers.Timer用法区别

时间:2018-01-24 19:53:06      阅读:1071      评论:0      收藏:0      [点我收藏+]

标签:time   art   定时器   程序假死   lap   stop   UI   sum   应用   

System.Windows.Forms.Timer

  基于窗体应用程序

  阻塞同步 

  单线程

  timer中处理时间较长则导致定时误差极大。

System.Timers.Timer 

  基于服务

  非阻塞异步

  多线程

        /// <summary>
        /// windows定时器
        /// </summary>
        System.Windows.Forms.Timer _wTimer;
        /// <summary>
        /// 应用程序生成定时器
        /// </summary>
        System.Timers.Timer _tTimer;
        
        private void Form1_Load(object sender, EventArgs e)
        {
            _wTimer = new System.Windows.Forms.Timer();
            _wTimer.Interval = 500;//设置时间间隔500毫秒
            _wTimer.Tick += _wTimer_Tick;
            _wTimer.Start();//启动定时器


            _tTimer = new System.Timers.Timer();
            _tTimer.Interval = 500;//设置时间间隔500毫秒
            _tTimer.Elapsed += _tTimer_Elapsed;
            //_tTimer.Start();



        }
        void _tTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Print("_tTimer_Elapsed" + _count.ToString());
            Thread.Sleep(2000);//休眠2秒
            _count++;
        }

        void _wTimer_Tick(object sender, EventArgs e)
        {
            Print("_wTimer_Tick" + _count.ToString());
            Thread.Sleep(2000);//休眠2秒
            _count++;
        }


        private void Print(string msg)
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke((Action)delegate() 
                {
                    textBox1.AppendText(msg + "\r\n");
                });
            }
            else
            {
                textBox1.AppendText(msg + "\r\n");
            }
        }

当启动_wTimer.Start(),输出结果。在_wTimer_Tick 休眠2秒阻塞主线程,导致程序假死2秒。而且事件没在没有处理完成不会进行下次,所以_count 结果每次只输出一次、

技术分享图片

 

当启动_tTimer.Start(),每隔500毫秒添加一个线程。由于异步只要到达时间间隔则自动生成下个线程,不管上个线程是否处理完成。

所以_count的结果会有多次输出。

技术分享图片

 

如果想解决 system.timers 没到时间间隔只生成一个线程或者说上次没有处理完下次则等待处理可以在处理前添加_tTimer.stop(),完成后再次启动_tTimer.start()。

 

简述System.Windows.Forms.Timer 与System.Timers.Timer用法区别

标签:time   art   定时器   程序假死   lap   stop   UI   sum   应用   

原文地址:https://www.cnblogs.com/wangyonglai/p/8342773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!