[英]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的设置。
请注意,如果此类属性确实退出,则会出现竞争条件:
虽然计时器的任何特定用途都不会受到影响,但一般情况下必须照顾它。
(在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.