System.Timers.Timer和System.Windows.Forms.Timer区别-测试笔记

System.Timers.Timer和System.Windows.Forms.Timer是有区别的。

我一个是非堵塞的,一个不是。更重要的的System.Timer是多线程的,如果控制不好执行时间的话,线程数会不断的增加。

测试代码:

public partial class Form1 : Form
    {
        private System.Timers.Timer timer;
        private System.Windows.Forms.Timer timer2;

        private int incount;
        private int outCount;

        public Form1()
        {
            InitializeComponent();

            this.timer = new System.Timers.Timer();
            this.timer.Interval = 100;
            this.timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);
            this.timer.Enabled = false;

            this.timer2 = new System.Windows.Forms.Timer();
            this.timer2.Interval = 100;
            this.timer2.Enabled = false;
            this.timer2.Tick+=new EventHandler(timer2_Tick);
        }

        #region System.Timers.Timer测试

        private void button1_Click(object sender, EventArgs e)
        {
            this.timer.Enabled = true;
            incount = 0;
            outCount = 0;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.timer.Enabled = false;
        }
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            System.Console.WriteLine(
                String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
                e.SignalTime, incount, outCount, (DateTime.Now - e.SignalTime).TotalMilliseconds));

            if (incount >= 30) { timer.Enabled = false; return; }

            incount = incount + 1;

            DoWork(e);

        }

        private void DoWork(ElapsedEventArgs e)
        {
            System.Threading.Thread.Sleep(5000);
            outCount = outCount + 1;

            System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
                e.SignalTime, incount, outCount, (DateTime.Now - e.SignalTime).TotalMilliseconds));
            System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
        }
        #endregion

        #region System.Windows.Forms.Timer测试

        private DateTime preDateTime;
        private void DoWork2()
        {
            System.Threading.Thread.Sleep(5000);
            outCount = outCount + 1;

            System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
                preDateTime, incount, outCount, (DateTime.Now - preDateTime).TotalMilliseconds));
            System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            this.preDateTime = DateTime.Now;

            System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
                preDateTime, incount, outCount, (DateTime.Now - preDateTime).TotalMilliseconds));

            if (incount >= 30) { timer.Enabled = false; return; }

            incount = incount + 1;

            DoWork2();
        }

      

        private void button3_Click(object sender, EventArgs e)
        {
            this.timer2.Enabled = true;
            incount = 0;
            outCount = 0;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.timer2.Enabled = false;
        }
        #endregion


    }
执行测试一:

--->timestamp:2014-03-14 11:32:06, incount/outcount: 15/5 ,i=5001.2861
#T15
#T15
--->timestamp:2014-03-14 11:32:11, incount/outcount: 15/5 ,i=0
#T22
--->timestamp:2014-03-14 11:32:11, incount/outcount: 16/5 ,i=0
--->timestamp:2014-03-14 11:32:06, incount/outcount: 17/6 ,i=5000.286
#T16
#T16
--->timestamp:2014-03-14 11:32:11, incount/outcount: 17/6 ,i=0
--->timestamp:2014-03-14 11:32:07, incount/outcount: 18/7 ,i=5000.286
#T17
#T17
--->timestamp:2014-03-14 11:32:12, incount/outcount: 18/7 ,i=0
--->timestamp:2014-03-14 11:32:07, incount/outcount: 19/8 ,i=5000.286
#T18
#T18
--->timestamp:2014-03-14 11:32:12, incount/outcount: 19/8 ,i=0
--->timestamp:2014-03-14 11:32:08, incount/outcount: 20/9 ,i=5001.2861
#T19
#T19
--->timestamp:2014-03-14 11:32:13, incount/outcount: 20/9 ,i=0
--->timestamp:2014-03-14 11:32:09, incount/outcount: 20/10 ,i=5000.286
#T20
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/11 ,i=5000.286
#T21
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/12 ,i=5000.286
#T6
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/13 ,i=5000.286
#T12
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/14 ,i=5000.286
#T13
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/15 ,i=5000.286
#T14
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/16 ,i=5000.286
#T15
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/17 ,i=5000.286
#T22
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/18 ,i=5000.286
#T16
--->timestamp:2014-03-14 11:32:12, incount/outcount: 20/19 ,i=5000.286
#T17
--->timestamp:2014-03-14 11:32:12, incount/outcount: 20/20 ,i=5000.286
#T18

5000/100为最大峰值为10个并发,如果间隔为1000为一半左右,我这个搞不明白,也没有心情算。

测试2:

#T10
--->timestamp:2014-03-14 11:37:52, incount/outcount: 0/0 ,i=0
--->timestamp:2014-03-14 11:37:52, incount/outcount: 1/1 ,i=5001.2861
#T10
#T10
--->timestamp:2014-03-14 11:37:57, incount/outcount: 1/1 ,i=0
--->timestamp:2014-03-14 11:37:57, incount/outcount: 2/2 ,i=5000.286
#T10
#T10
--->timestamp:2014-03-14 11:38:02, incount/outcount: 2/2 ,i=0
--->timestamp:2014-03-14 11:38:02, incount/outcount: 3/3 ,i=5000.286
#T10
#T10
--->timestamp:2014-03-14 11:38:07, incount/outcount: 3/3 ,i=0
为单线程,而且执行的时候堵塞UI线程,在执行的时候鼠标Sleep,timer间隔期不等待。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这三种 Timer 都可以在 .NET Framework 中用来执行定时任务,但它们的实现方式和使用场景略有不同: 1. System.Windows.Forms.Timer System.Windows.Forms.TimerWindows 窗体应用程序中常用的计时器,它是在 UI 线程上执行的,每隔一定时间触发 Tick 事件,可以用来执行一些与 UI 相关的任务,例如更新控件状态或显示动画效果等。由于它是在 UI 线程上执行的,所以不能用于长时间的计算和繁重的任务。 2. System.Timers.Timer System.Timers.Timer 是一个多线程计时器,它在一个单独的线程上执行,每隔一定时间触发 Elapsed 事件,可以用来执行一些不需要与 UI 相关的任务,例如后台数据处理、日志记录等。由于它是在一个单独的线程上执行的,所以可以用于长时间的计算和繁重的任务。 3. System.Threading.Timer System.Threading.Timer 是一个基于线程池的计时器,它在一个线程池线程上执行,每隔一定时间触发回调方法,可以用来执行一些不需要与 UI 相关的任务,例如后台数据处理、日志记录等。由于它是基于线程池的,所以比 System.Timers.Timer 更加轻量级,但不适用于长时间的计算和繁重的任务。 总结来说,System.Windows.Forms.Timer 适用于与 UI 相关的定时任务,System.Timers.Timer 和 System.Threading.Timer 适用于不需要与 UI 相关的定时任务,其中前者在一个单独的线程上执行,后者在一个线程池线程上执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值