这是一个密码。快跑,立即按压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();
}
}
}发布于 2015-05-29 23:02:24
按照编写代码的方式,您有两个函数()路径。其中一条路径是,当计时器实际过期时,函数()就会被“处理”。另一条路是
interval - stopwatch.ElapsedMilliseconds不大于0,在这种情况下直接调用函数()。
看起来您正在使用System.Timers.Timer。这是在线程池线程上运行的。因为有多个线程在运行,所以这两个线程都可以调用Function()。您可能认为通过在Function()中重置内部和秒表来防范这种情况,但是Console.WriteLine()足以允许一个线程推迟而让另一个线程运行(在多处理器计算机上,这两个线程可以同时在不同的处理器上运行)。
根据逻辑的本质,可以保证计时器间隔几乎在间隔测试达到0的同时触发(调用处理程序),因此您可以期望它在这两条路径上运行。
这个例子看上去不太有用。仅仅是为了理解计时器吗?如果你愿意的话,你可以改变时间间隔,但是当你把时间更改为大致的时间间隔(或者应该改变的时间间隔)时,你为什么要费心呢?
https://stackoverflow.com/questions/30540234
复制相似问题