系统.计时器.计时器 在不自动重置的情况下重新启动会忽略间隔



我得到了一个System.Timers.Timer (即使Threading.Timer 更强大,我也需要重新启动选项),它应该调用一个Event(Function)进行数据交换。我的计时器初始化:

private System.Timers.Timer _scheduler;     //on class level  
_scheduler = new System.Timers.Timer(double.Parse(Config.TimeIntervall));
_scheduler.AutoReset = false;
_scheduler.Elapsed += (o, args) => InterfaceSingleRun();
_scheduler.Start();

该函数启动一个任务,在finally语句中我得到了

_scheduler.Start()

重新启动我的计时器,它应该再次开始倒计时间隔

我的问题:我想防止重叠,因为我不知道任务将运行多长时间(取决于服务器),但_schedulter.Start()只是重新启动已用事件,而不是等待间隔时间。您能否告诉我,如果我只是误解了MSDN站点/计时器遇到了一些问题以及如何解决它们/或者我的代码只是搞砸了:)

谢谢

编辑:解决了这个问题,感谢Hans Passant。我正在使用秒,程序将其解释为毫秒。

如果我理解正确,您希望在timer_tick中的代码运行时防止第二个触发器。

我使用这样的全局布尔值:

class Program
{
    private static bool timercodeRunning;
    static void Main(string[] args)
    {
        var timer = new System.Timers.Timer(5000);
        timer.Elapsed += timer_Elapsed;
        timer.Start();
    }
    static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (!timercodeRunning)
        {
            timercodeRunning = true;
            try
            {
                //DO SOME STUFF

                timercodeRunning = false;
            }
            catch (Exception)
            {
                timercodeRunning = false;
                throw;
            }
        }
    }
}

我建议你尝试锁定,而不是布尔值。 这是Gelootn的修改代码

    class Program
{
    private static object timercodeRunning = new object();
    static void Main(string[] args)
    {
        var timer = new System.Timers.Timer(5000);
        timer.Elapsed += timer_Elapsed;
        timer.Start();
    }
    static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        lock (timercodeRunning)
        {
            try
            {
                //DO SOME STUFF
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

最新更新