System.Timers.Timer奇怪的行为

时间:2015-05-29 22:51:04

标签: c# timer

这是一个代码。运行并立即按住P键。您应该看到第一个日期两次。我知道了。我真的不知道为什么会这样。我想了解它。有人能以清楚的方式向我解释吗?

using System;
using System.Timers;
using System.Diagnostics;

namespace Timer1
{
    class Program
    {
        static Stopwatch stopwatch = new Stopwatch();

        static Timer timer;

        static int interval = 1000;

        static void Main(string[] args)
        {
            Console.SetBufferSize(1000, 1000);

            timer = new Timer(interval);
            timer.Elapsed += Function;
            timer.Interval = interval;
            timer.Enabled = true;

            stopwatch.Start();

            while (true)
            {
                ConsoleKey key = Console.ReadKey(true).Key;

                if (key == ConsoleKey.P)
                {
                    int temp = interval - (int)stopwatch.ElapsedMilliseconds;

                    if (temp > 0)
                        timer.Interval = temp;

                    else
                        Function(null, null);
                }

                else
                {
                    timer.Dispose();
                    break;
                }

                Console.ReadKey(true);
            }
        }

        static public void Function(object sender, EventArgs e)
        {
            timer.Interval = interval;
            Console.WriteLine(DateTime.Now);
            stopwatch.Reset();
            stopwatch.Start();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

编写代码的方式有两条到Function()的路径。一条路径是定时器实际经过并且因此“处理”Function()。另一条路是

java

不大于0,在这种情况下直接调用Function()。

看起来您正在使用System.Timers.Timer。这是在线程池线程上运行的。由于您运行了多个线程,因此它们都可以调用Function()。您可能认为通过在Function()中重置内部和秒表来防止这种情况,但是Console.WriteLine()足以允许一个线程延迟并让另一个线程运行(并且在多处理器计算机上,两个线程都可以在曾经在不同的处理器上。)

根据逻辑的性质,保证定时器间隔将在间隔测试达到0的几乎同一时间触发(调用处理程序),因此您可以期望它在两个路径中运行。

该示例看起来不太有用。只是理解计时器吗?如果你愿意,你可以改变时间间隔,但是当你把它改变成大概是什么(或应该是)时,为什么还要费心呢?