zoukankan      html  css  js  c++  java
  • 简述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()。

  • 相关阅读:
    result set sql server
    [转载]:C#、.Net面试题目及答案
    [转载]:合并两个已排序好的int数组,并排序返回c#实现
    [转载]实际举例C#引用类型和值类型的区别
    mysql 性能优化方案
    oracle 并行原理深入解析及案例精粹
    创建Oracle外部表 External Table
    Oracle 分区表
    MySQL索引类型一览
    MySQL配置文件mysql.ini参数详解、MySQL性能优化
  • 原文地址:https://www.cnblogs.com/wangyonglai/p/8342773.html
Copyright © 2011-2022 走看看