Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#定时器触发太早_C#_Timer_System.timers.timer - Fatal编程技术网

C#定时器触发太早

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_Start()方法时,它首先起作用:第二次控制台打印在一个合理的时间出现,但是控制台打印之间的间隔越来越小

在一些打印之后,几乎每一次打印都在不到5秒的时间内完成,尽管代码应该设置一个至少5秒的计时器,对吗


静态定时器;
静态随机=新随机();
公共静态无效随机_开始()
{
定时器=新定时器(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
是不必要的,因为它只有在计时器已启用时才会执行。。。