Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么计时器没有属性,如何获取它';初始化后的时间间隔?_C#_.net_Multithreading_Timer_Windows Services - Fatal编程技术网

C# 为什么计时器没有属性,如何获取它';初始化后的时间间隔?

C# 为什么计时器没有属性,如何获取它';初始化后的时间间隔?,c#,.net,multithreading,timer,windows-services,C#,.net,Multithreading,Timer,Windows Services,我正在windows服务中使用一个用于夜间导入例程的。它每分钟都在数据库中查找要导入的新文件。现在,由于该服务整天都在运行,我想更改它,使其在夜间每分钟运行一次,在白天每5分钟运行一次 因此我想我可以检查当前时间,在上午7点到晚上10点之间使用日间间隔配置值,否则使用夜间间隔 现在进入实际问题:Timer-类中为什么没有指示当前时段/间隔的属性?然后我可以根据它的值来决定是否需要更改它 作为一种解决方法,我可以将其存储在一个附加字段中,但我想知道是否有可能从计时器本身获取值 请注意,我正在使用:

我正在windows服务中使用一个用于夜间导入例程的。它每分钟都在数据库中查找要导入的新文件。现在,由于该服务整天都在运行,我想更改它,使其在夜间每分钟运行一次,在白天每5分钟运行一次

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

现在进入实际问题:
Timer
-类中为什么没有指示当前时段/间隔的属性?然后我可以根据它的值来决定是否需要更改它

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

请注意,我正在使用:

为什么Timer类中没有指示当前时段/间隔的属性

我假设(我不是.NET实现团队的一员,所以不得不假设)这是因为它使用了Win32可等待计时器。而且,没有API可以获取应用程序的设置

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

  • 线程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;
    }
}
private void importimer\u已过(对象o)
{
滴答声——;

如果该计时器不适合您的需要,那么请使用.NET中具有更强大功能集的其他计时器之一应该是显而易见的,微软没有编写它们。这是一场不可能发生的线程竞赛,功能不是bug。没有什么你不能用一个变量和一个锁来修复自己。你需要获得时间间隔还是它足以设置?在这种情况下
Change()
应该可以工作。@HansPassant:线程竞赛是一个很好的理由,谢谢。@PatrikEckebrecht:我想知道是否有必要更改计时器(或通过构造函数重新创建计时器)。这就是为什么我要寻找一个属性。但正如我已经提到的,我可以使用另一个字段。我只是以前没有见过这样一个类,它不公开任何属性,即使它应该有一些属性。这就是为什么我想知道这是否是一个常见的设计决策。谢谢:@TimSchmelter HI-我知道-但这只符合System.Windows.Forms.Timer:不是System.Timers.Timer-->“…若要解决此问题,请使用System.Timers命名空间中的服务器计时器,而不是System.Windows.Forms命名空间中的Windows窗体计时器。若要执行此操作,请执行以下步骤…”我不想(重新-)如果没有必要,请在
appeased
事件中创建计时器。我显示的代码是初始初始化,但只有在必要时才应更改。此外,计时器本身已过,因此无需计数。但它使用的包装器与实际存储期间和其他属性的包装器类似。因此,应该可以提供它,但它似乎不需要o不受欢迎..如果不看Rotor之类的东西,我不知道实现是否已更改(例如,每个实例对当前实现使用了自己的Win32计时器)。在任何情况下,与读取设置相关联的比赛条件都使不公开属性成为一个不错的选择。您的代码只需在处理程序中使用逻辑跟踪
dayRate
标记
如果是dayRate而不是dayRate,则切换速度…
。如果您提到可能的比赛条件,我可以将您的答案标记为已接受因为这似乎是隐藏它的原因。我已经成功地用另一个字段实现了解决方案。我只是好奇为什么会这样。谢谢。@TimSchmelter done。当然,还有一些线程在另一个线程做了不同的更改时,假设应用了它们的更改…小应用程序不太可能对于这些问题,由多个团队围绕一个核心计时器驱动操作构建的大型应用程序有更大的潜在问题。
private void ImportTimer_Elapsed(object o)
{
    tickCount--;
    if (tickCount <= 0)
    {
        // do your stuff

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