【问题标题】:Fire method after variable amount of time可变时间后的火灾方法
【发布时间】:2016-03-17 14:18:54
【问题描述】:

我正在 c# 中构建警报器服务(Windows 服务)。该服务将启动并执行一些 api 调用。根据我从调用中获得的结果和适用于该用户的设置,另一种方法将在 x 时间后触发。这种情况一直持续到用户停止服务为止。

调用方法之间的时间是可变的。所以启动后第一个方法调用可以在 1 分钟之后,然后下一个调用可以在 5 分钟之后,之后的调用可以在 10 分钟之后。一切都取决于我从 API 获得的响应。

我一直在研究 system.timers,但我发现的每个示例都有一个固定的事件触发时间,因此不符合我的需求。

【问题讨论】:

  • 我想,最简单的方法就是在每次计时器运行时更​​新Timer.Interval

标签: c# windows-services


【解决方案1】:

全局定义时间变量,每次响应后重置间隔时间

仅供参考

1 分钟 = 60000 所以 10 分钟 aTimer.Interval=60000 * 10;

像这样使用它

    //defined globally
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
     //api call goes here 
    aTimer.Interval=5000; // here you can define the time or reset it after each api call
    aTimer.Enabled=true;

【讨论】:

  • 值得注意的是,间隔以毫秒为单位,因此aTimer.Interval=5000 是 5 秒延迟。
  • 1 分钟 = 60000 所以 10 分钟 aTimer.Interval=60000 * 10;
【解决方案2】:

使用一次性计时器,并在每次通话后重置。我通常为此使用System.Threading.Timer

// When you first create the timer, set it for the initial time
Timer MyTimer = new Timer(TimerCallbackFunction, null, 60000, Timeout.Infinite);

将周期设置为Timeout.Infinite 可防止计时器多次计时。它只会打勾一次,然后无限期地等待,或者直到你重新启动它。

在你的计时器回调中,做任何需要做的事情,然后重置计时器:

void TimerCallbackFunction(object state)
{
    // Here, do whatever you need to do.
    // Then set the timer for the next interval.
    MyTimer.Change(newTimeoutValue, Timeout.Infinite);
}

这可以防止多个并发回调(如果您的超时值太短),还可以让您指定下一个滴答的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2013-06-09
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多