其他分享
首页 > 其他分享> > 为什么Timer没有属性,如何在初始化后获取它的间隔?

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

作者:互联网

我在Windows服务中将System.Threading.Timer用于每晚导入例程.它每分钟都会在数据库中查找要导入的新文件.现在,由于该服务全天运行,因此我想对其进行更改,使其在晚上每分钟和每天第5分钟运行一次.

因此,我认为我可以检查当前时间,在7am到10PM之间使用day-interval-configuration值,否则使用night-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 Waitable Timer.而且没有API可以获取Waitable Timer的设置.

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

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

虽然计时器的任何特定用途可能不会遭受此影响,但一般情况下必须迎合它.

(在Win32中,更糟糕的是,可以命名WaitableTimer,从而从其他进程进行访问.)

标签:multithreading,windows-services,timer,c,net
来源: https://codeday.me/bug/20191120/2042308.html