为什么 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;
}
}
我在 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;
}
}