C#定时器触发太早
当我调用random_Start()方法时,它首先起作用:第二次控制台打印在一个合理的时间出现,但是控制台打印之间的间隔越来越小 在一些打印之后,几乎每一次打印都在不到5秒的时间内完成,尽管代码应该设置一个至少5秒的计时器,对吗C#定时器触发太早,c#,timer,system.timers.timer,C#,Timer,System.timers.timer,当我调用random_Start()方法时,它首先起作用:第二次控制台打印在一个合理的时间出现,但是控制台打印之间的间隔越来越小 在一些打印之后,几乎每一次打印都在不到5秒的时间内完成,尽管代码应该设置一个至少5秒的计时器,对吗 静态定时器; 静态随机=新随机(); 公共静态无效随机_开始() { 定时器=新定时器(random.NextDouble()*10000+5000); timer.appeased+=OnTimedEvent; timer.Start(); 控制台写入线(“开始”)
静态定时器;
静态随机=新随机();
公共静态无效随机_开始()
{
定时器=新定时器(random.NextDouble()*10000+5000);
timer.appeased+=OnTimedEvent;
timer.Start();
控制台写入线(“开始”);
}
私有静态void OnTimedEvent(对象源,ElapsedEventArgs e)
{
随机启动();
}
设置计时器,使您不会在每次计时器滴答声中创建新实例。在下面的例子中,我禁用了自动重置,这样我们就可以设置一个新的间隔并手动重新启动计时器
static Timer timer;
static Random random = new Random();
public static void random_Start()
{
timer = new Timer(random.NextDouble()*10000+5000);
timer.Elapsed += OnTimedEvent;
timer.AutoReset = false;
timer.Start();
Console.WriteLine("Start");
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("Tick");
timer.Interval = random.NextDouble()*10000+5000;
timer.Start();
}
问题是,当在OnTimedEvent委托中调用random_Start时,会创建并分配新的计时器实例,它永远不会停止。你不应该每次定时器超时都调用random\u Start。
random.NextDouble()*10000+5000
似乎很奇怪。为什么不直接调用random.Next(minValue,maxValue)
?事实上,为了响应鲁弗斯刚才所说的,如果你想要一个介于5000到15000毫秒之间的数字,调用random就更具可读性了。Next(5000,15000)
调用事件处理程序中的Start
是不必要的,因为它只有在计时器已启用时才会执行。。。