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


    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 + "
    ");
                    });
                }
                else
                {
                    textBox1.AppendText(msg + "
    ");
                }
            }

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

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

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

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

  • 相关阅读:
    LeetCode 67 Add Binary(二进制相加)(*)
    从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志
    Registration system
    BZOJ 1055 HAOI2008 玩具取名 动态规划
    9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中
    B-Tree 索引和 Hash 索引的对照
    负载均衡之基于DNS负载
    Eclipse中git插件导入远程库和上传项目源代码到远程库
    Android开发艺术-第二章 IPC 机制
    一天教你入门struts2
  • 原文地址:https://www.cnblogs.com/wangyonglai/p/8342773.html
Copyright © 2020-2023  润新知