Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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_Windows_Multithreading_Timer - Fatal编程技术网

C# 如何使计时器以循环方式启动

C# 如何使计时器以循环方式启动,c#,.net,windows,multithreading,timer,C#,.net,Windows,Multithreading,Timer,我有一个计时器,我想在每周一下午5点到期。在测试应用程序时,只要周一下午5点,我的任务就会按预期的方式被触发 但是,当我将系统日期和时间更改为下一周下午5点时,任务不会启动。这是我的代码: Timer timer = new Timer(callback, application, timeToEnd, TimeSpan.FromDays(7)); 我有一种感觉,它与TimeSpan.FromDays(7)部分有关。有什么想法吗?没有一个计时器依赖于系统时间 更改时钟不会影响System.Wi

我有一个计时器,我想在每周一下午5点到期。在测试应用程序时,只要周一下午5点,我的任务就会按预期的方式被触发

但是,当我将系统日期和时间更改为下一周下午5点时,任务不会启动。这是我的代码:

Timer timer = new Timer(callback, application, timeToEnd, TimeSpan.FromDays(7));

我有一种感觉,它与
TimeSpan.FromDays(7)
部分有关。有什么想法吗?

没有一个计时器依赖于系统时间

更改时钟不会影响
System.Windows.Forms.Timer
System.Timers.Timer
System.Threading.Timer

如果你需要处理这些情况,你必须依靠


否则,您可以定期检查
DateTime.Now.DayOfWeek==DayOfWeek.Monday
这不是
计时器的好用途。您应该创建一个执行所需操作的控制台应用程序,然后使用Windows调度程序或第三方调度工具对其进行调度


否则,更安全的做法是将计时器设置为以较短的间隔(1分钟?)运行,并检查系统时钟是否需要运行(例如,是否在5:00的1分钟内?

如果您不想依赖外部服务,如窗口任务调度器,则必须创建一个定期启动的计时器(每分钟一次)并检查当前时间,如果当前时间已超过下一个过期时间,它将实际执行所需的操作(包括设置下一个过期时间)

除非您在低功耗设备上运行,否则每分钟执行一次时间检查应该不是问题

将时钟向前移动一周是一个非常极端的措施,但夏令时也可以移动时钟,特别是在虚拟机上,您可能会出现一些意外的时钟漂移。这就是为什么在大多数时间定期检查当前时间比在遥远的未来某个时间设置计时器要好的原因


说到夏令时,您需要处理时钟向后移动一小时的情况,以防您想在该时间间隔内执行活动。

您现在有麻烦了。我们要求框架在
x天、y小时、z分钟后通知您。因此计时器将在您告诉它的时间后准确启动

我知道这不是正确的方法,但这会奏效的

SystemEvents.TimeChanged += SystemEvents_TimeChanged;

static void SystemEvents_TimeChanged(object sender, EventArgs e)
{
    timer.Dispose();//Dispose your previous timer
    SetTimerAgain();//Call the method which sets the timer again. you're done
}
我建议您使用“Windows计划任务”,但由于某些原因,您不能这样做,所以这里是解决方法

您还可以按照@giammin的建议运行定期计时器

TimerCallback callback = (state) =>
{      
    var now = DateTime.Now; 
    if(now.DayOfWeek == DayOfWeek.Monday 
     && now.TimeOfDay.Hours == 17 && now.TimeOfDay.Minutes == 0)
    {
        MyMethod();
    }
};

Timer timer = new Timer(callback, application, 0, 10000);//10seconds

对于后一种方法,您应该避免在同一天反复调用该方法。

如果您想要一个在特定时间启动的计时器,请使用。遗憾的是,.NET库没有该计时器的包装器。我不久前为一篇文章写过一个。该文章不再在线提供,但您可以n从下载源代码


也就是说,在我看来,你拥有的是一个。按照别人的建议去做,让它成为一个简单的控制台应用程序,你可以通过预定的任务来控制它。

我同意你的观点,但是这不是我的代码,因此我不能重写所有的代码。你不必重写所有的代码,只要创建一个控制台应用程序,每天调用一次相关的现有代码即可d计划在所需的时间运行。
Timer
设计用于在非指定时间的间隔上运行代码。但是,我添加了一些额外的可能性。很有趣。这可以解释它-但是在这种情况下,Timer类从何处获得时间?因为它肯定是基于系统时钟的,因为我的电脑的时钟是提前5分钟-计时器仍然在下午5点启动clock@DotNET它使用处理器刻度,而不是windows日期。这是由于您如何使用DateTime对计时器进行日化。现在我明白了,感谢您的澄清。因此,理论上我的代码没有问题,如果我不得不等待一周,任务应该再次启动?@DotNET是的,但最好检查k表示日期时间。现在,在这么长的时间内,我们不使用计时器,因为除了时间更改之外,可能还会有日光节约时间。请帮助,+1!您使用的是哪个计时器?@Servy-System.Threading.TimerI我只是为了测试目的更改系统时间,但是在部署的环境中,系统时间不会更改。为了澄清-如果我必须保持代码不变,而不更改系统时间,计时器会在下周一启动吗?我只是更改系统日期和时间,以尝试模拟一周过去,只是为了测试它。是的,它应该可以正常工作。如果您将比赛时间精确设置为
周一下午5点
,那么您可能会遇到问题。此时它可能无法正常工作。否则它应该可以工作。感谢您的澄清!@DotNET是的,并且该机制不是测试该机制的适当方式。它将在一周内启动。更改系统时间根本不会影响它;无论如何,它将在一周内启动。