多个定时器逝去问题(Multiple timer elapsed issue)

2019-10-19 20:51发布

我有一个计时器定义如下。 计时器执行长时间运行的任务。 当定时器运行区间再次经过与另一个定时器开始执行,即我的问题是_timer_Elapsed 。 我怎样才能得到定时器结束后定时器执行一个区间。 事情是这样的,现在可能有多个计时器执行发生一次,并且会引发各种问题与我的代码。

protected override void OnStart(string[] args)
        {

           _timer = new System.Timers.Timer();
           _timer.AutoReset = false;
           _timer.Interval = (Convert.ToInt32(ConfigurationManager.AppSettings["CheckInterval"]));
           _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
           _timer.Enabled = true;
           _timer.Start(); // Start timer 

        }


 public static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                _timer.Interval = (Convert.ToInt32(ConfigurationManager.AppSettings["CheckInterval"])); 

                BLLGenericResult SystemCheckItems_Result = ServiceItemOperations.CheckItems(); // Long Running Task

            }
            catch (Exception ex)
            {
                // Exception handling...
            }
            finally
            {
                _timer.Start();
            }
        }

Answer 1:

让我们正确地写起来。 它是一种让你陷入困境的间隔分配。 演示该问题的样本程序:

using System;

class Program {
    static System.Timers.Timer timer;
    static void Main(string[] args) {
        timer = new System.Timers.Timer();
        timer.AutoReset = false;
        timer.Interval = 1000;
        timer.Elapsed += timer_Elapsed;
        timer.Start();
        Console.ReadLine();
    }

    static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
        timer.Interval = 1000;
        Console.WriteLine("Tick");
    }
}

输出:

Tick
Tick
Tick
...

在经过的事件处理程序删除间隔分配看出区别。

因此,换句话说,即使自动复位特性是假的 ,只是分配Interval属性足以让计时器重新启动。 当然大惊喜,从来没有人看见的是未来。 它严重破坏你的计划,因为你提前分配Interval属性,你开始做繁重之前 。 所以,经过事件将再次被提出,在另一个线程,而你的前一个尚未完成尚未运行。 这是一个线程错误等待发生,特别是如果你的时间间隔值太小。 你需要在以后分配给它,这样做最终块内。 您所做的间隔太小,很难后来诊断好事。

这是C#的错误?

C#语言是打爆,这是一个.NET Framework错误。 System.Timers.Timer是一般只是没有一个很好的类,它有电锯的可用性无安全开关。 这是为了使System.Threading.Timer类更可用,特别是解决一个问题,它是太快了垃圾收集的习惯。 一个问题解决了,但增加了三个新的问题。 这又回到了.NET 1.0,一个框架版本与培训车轮。 他们只是不能修复它了,太多现有的代码将打破。 你真的是与System.Threading.Timer更好,只是一定要保持在一个变量引用的对象。 就像你已经这样做了。



Answer 2:

一个2017年更新:

有一个新的工具,它可以与这些类型的问题非常有用。

await Task.Delay(TimeSpan.FromSeconds(x)); 


文章来源: Multiple timer elapsed issue