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间隔期不等待。


WinForm中提供了三种类型的计时器:基于Windows的标准计时器(System.Windows.Forms.Timer)、基于服务器的计时器(System.Timers.Timer线程计时器(System.Threading.Timer)\[1\]。 其中,基于Windows的标准计时器(System.Windows.Forms.Timer)适合单线程使用,但会影响界面的响应,精确度也不高\[2\]。它可以通过在工具箱中拖动Timer控件到窗体上,并设置事件间隔时间等属性来使用\[3\]。 基于服务器的计时器(System.Timers.Timer)不依赖于窗体,是为了在服务器环境下运行而优化的计时器\[3\]。 线程计时器(System.Threading.Timer)也不依赖于窗体,是一种简单且轻量级的计时器,使用回调方法而不是事件,并由线程池线程提供支持。在WPF中通常使用这种计时器\[3\]。 根据你的需求,你可以根据具体情况选择适合的计时器类型来实现WinForm计时器功能。 #### 引用[.reference_title] - *1* *3* [C#计时器学习笔记](https://blog.csdn.net/weixin_44879611/article/details/102637580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [.NET winform三种计时器的使用](https://blog.csdn.net/qq_42353026/article/details/118609165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值