为什么 Timer 没有属性,初始化后如何获取它的时间间隔?

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

我在 windows 服务中使用 System.Threading.Timer 进行夜间导入例程。它每分钟都在数据库中查找要导入的新文件。现在,由于该服务全天运行,我想将其更改为晚上每分钟运行一次,白天每 5 分钟运行一次。

因此我想我可以检查当前时间,在早上 7 点到晚上 10 点之间使用 day-interval-configuration 值,否则使用 night-interval。

现在正题:为什么Timer-class中没有属性表示当前的period/interval?然后我可以根据它的价值决定是否必须改变它。

作为解决方法,我可以将它存储在附加字段中,但我想知道是否可以从计时器本身获取值。

请注意,我使用的是 this constructor:

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

Why is there no property in the Timer-class which indicates the current period/interval?

我假设(我不是 .NET 实施团队的成员,所以不得不假设)这是因为它使用了 Win32 可等待计时器。而且没有API得到一个Waitable Timer.

的设置

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

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

虽然定时器的任何特定用途可能不会受到影响,但一般情况必须满足它。

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

您可以使用 System.Timers.Timer 代替,它提供了这样一个 属性 (".Intervall")

System.Threading.Timer 没有带有间隔值的内部字段。我查看了 .net 代码,发现无法通过反射获取当前周期。

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

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

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