System.Timers.Timer在没有AutoReset的情况下重新启动会忽略Intervall

时间:2015-04-21 09:09:22

标签: c# multithreading events timer task

我有一个System.Timers.Timer(即使Threading.Timer更强大,我需要重启选项),它应该调用事件(函数)进行数据交换。 我的计时器初始化:

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()只是重新启动Elapsed Event,而不是等待intervall时间。 你能否告诉我,如果我误解了MSDN-Site / Timer遇到了一些问题以及如何修复它们/或者我的代码搞砸了:)

由于

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

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你想在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;
            }

        }
    }
}

答案 1 :(得分:0)

而不是bool我建议你尝试锁定。这里是修改代码的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;
            }
        }
    }
}