这是一个代码。运行并立即按住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();
}
}
}
答案 0 :(得分:1)
编写代码的方式有两条到Function()的路径。一条路径是定时器实际经过并且因此“处理”Function()。另一条路是
java
不大于0,在这种情况下直接调用Function()。
看起来您正在使用System.Timers.Timer。这是在线程池线程上运行的。由于您运行了多个线程,因此它们都可以调用Function()。您可能认为通过在Function()中重置内部和秒表来防止这种情况,但是Console.WriteLine()足以允许一个线程延迟并让另一个线程运行(并且在多处理器计算机上,两个线程都可以在曾经在不同的处理器上。)
根据逻辑的性质,保证定时器间隔将在间隔测试达到0的几乎同一时间触发(调用处理程序),因此您可以期望它在两个路径中运行。
该示例看起来不太有用。只是理解计时器吗?如果你愿意,你可以改变时间间隔,但是当你把它改变成大概是什么(或应该是)时,为什么还要费心呢?