【问题标题】:Firing an event on fixed intervals以固定间隔触发事件
【发布时间】:2012-12-27 17:03:15
【问题描述】:

我有一个场景,我想跟踪我的控制台应用程序是活着还是死了(由于异常等)。

当控制台应用程序执行它的处理时,我希望有一个机制,它有一个计时器,它在每 N 分钟后继续调用一个报告方法,这个被调用的方法会更新数据库中的时间戳。

所以:

1 - Console application starts 
2 - Reports time stamp
3 - Keeps on doing its task (while in parallel it reports again after N seconds)

我知道我可以生成一个线程并让它在“N”分钟后休眠并再次唤醒,但这是多么可靠,因为线程可能在资源空闲之前不会触发,并且“N”分钟可能不再有效,因为线程将在自己的时间触发。

如何确保在处理过程中并行完成报告?

【问题讨论】:

  • 你的想法是对的,你只需要确保 N 明显小于任何检查它的值。比如每分钟更新一次数据库,但是每5分钟才检查一次,最后5分钟内的任何时间戳都是有效的。

标签: c# multithreading console-application


【解决方案1】:

与其创建自己的线程,不如使用内置定时器:

    private DateTime startTime;
    private System.Threading.Timer theTimer;

启动计时器:

            this.startTime = DateTime.Now;
            TimerCallback callback = TimerTick;
            this.theTimer = new System.Threading.Timer(callback, null, 0, 1000);

回调方法:

    void TimerTick(object stateInfo)
    {
        TimeSpan currentTime = DateTime.Now - startTime;
        // Do your stuff here.
    }

这会创建一个无延迟的计时器,每秒触发一次。

MSDN page

第一个整数是dueTime 在调用回调 方法之前的延迟时间。指定零会立即启动计时器。

第二个整数是period - 即回调数学调用之间的时间间隔。

您需要确保您在TimerTick 中的处理时间少于您指定的时间段,或者确保它可以重入 - 即它可以应对在前一次调用完成之前被调用的情况。您如何做到这一点 - 或者您是否可以做到这一点 - 取决于您的应用程序。

【讨论】:

  • 正是我需要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
相关资源
最近更新 更多