【问题标题】:System.Timers.Timer Restart without AutoReset ignores IntervallSystem.Timers.Timer Restart without AutoReset 忽略 Intervall
【发布时间】:2015-04-21 09:09:22
【问题描述】:

我有一个 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,而不是等待间隔时间。 如果我只是误解了 MSDN-Site/Timer 有一些问题以及如何解决它们/或者我的代码只是搞砸了,请告诉我:)

谢谢

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

【问题讨论】:

  • 我的水晶球说Config.TimeIntervall 是秒而不是毫秒。
  • 我想要你的水晶球……的确如此。只是现在无法测试它,因为我的代码不起作用..一旦我解决了其他一些小问题,您就会得到答案;)
  • 不用麻烦,乘以 1000 就行了。
  • 所有冰雹你的水晶球:) 修复了我的代码,乘以 1000,一切都很好.. 正在测试 - 我认为 - 20 秒,即 20 毫秒,看起来像立即重启。如果你给我一些东西来标记为解决方案,我会做的。感谢修复

标签: c# multithreading events timer task


【解决方案1】:

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

        }
    }
}

【讨论】:

  • 好主意,但我不想松开/忽略 Elapsed-Event,我只想延迟它。功能完成后,计时器应以完整的 5000 重新开始。您的示例可以在函数完成后立即重新启动,即当持续时间为 9990 时。
  • 您可以在启动滴答声时停止计时器,并在您的代码完成后(或在 catch/finaly 中)再次启动计时器
【解决方案2】:

我建议您尝试锁定,而不是 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;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多