繁体   English   中英

为什么Timer没有属性,如何在初始化后得到它的间隔?

[英]Why Timer has no properties, how to get it's interval after initialization?

我在我的Windows服务中使用System.Threading.Timer进行夜间导入例程。 它会在数据库中查找要导入的新文件的每一分钟。 现在,由于服务全天运行,我想改变它,以便它在每分钟晚上运行,每隔5分钟运行一天。

因此我认为我可以检查当前时间,在早上7点到晚上10点之间使用日间隔配置值,否则使用夜间间隔。

现在问到实际的问题:为什么Timer -class中没有属性表示当前的周期/间隔? 然后我可以根据它的价值决定是否必须改变它。

作为一种解决方法,我可以将它存储在一个额外的字段中,但我想知道是否有可能从计时器本身获取值。

请注意,我正在使用此构造函数

//start immediately, interval is in TimeSpan, default is every minute
importTimer = new System.Threading.Timer(
    ImportTimer_Elapsed,
    null,
    TimeSpan.Zero,
    Settings.Default.ServiceInterval_Night
);

为什么Timer-class中没有表示当前周期/间隔的属性?

我假设(我不是.NET实现团队的一员,所以必须假设)这是因为它使用了Win32 Waitable Timer。 并且没有API来获取Waitable Timer的设置。

请注意,如果此类属性确实退出,则会出现竞争条件:

  • 线程1读取属性并基于它启动一些业务逻辑
  • 线程2更改属性(使线程1的逻辑无效)
  • 线程1更新属性。

虽然计时器的任何特定用途都不会受到影响,但一般情况下必须照顾它。

(在Win32中,更糟糕的是可以命名WaitableTimer,因此可以从其他进程访问。)

您可以使用System.Timers.Timer ,它提供了这样的属性(“.Intervall”)

System.Threading.Timer没有带有intervall值的内部字段。 我看了一下.net代码,我发现它不可能通过反射得到当前时期。

不要乱用滴答率。 而是在固定数量的滴答之后调用您的代码,具体取决于时间:

private void ImportTimer_Elapsed(object o)
{
    tickCount--;
    if (tickCount <= 0)
    {
        // do your stuff

        tickCount = Between7AMAnd10PM() ? 5 : 1;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM