我有一些计时器从表中读取HH:MM:SS,以确定何时每天运行。
例如:
定时器A需要每周一13:00运行
计时器B需要每周二02:00运行
计时器C需要每小时运行一次
因此,在我的代码中,我知道当前时间是什么,然后计算从DateTime.Now()到下一个计时器应该运行的毫秒。当计时器的Elapsed事件完成后,它将重新计算它应该在何时下一个运行。由于时间的变化,这在这个周末造成了一个问题。
有更好的方法吗?DateTime.UtcNow会是一个更好的选择吗?可以将数据库中的时间字符串转换为UTC时间,然后计算出DateTime.UtcNow()而不是DateTime.Now()之间的区别。
发布于 2015-11-03 13:50:46
你可以做几件事来解决这个问题。
一种是将UTC用于所有计划好的工作。这给您提供了一个健壮、可预测的系统,不会带来许多复杂的问题或测试负担。但夏季星期一的作业将在冬天的02:00进行。如果可以的话,UTC的策略是好的。
(测试时区切换用例是件痛苦的事,如果您将UTC用于任何事情,您的测试负担就会减少。)
另一种方法是认真对待你的约会算法,并且要非常小心。即使在转换日期,C#的DateTime类也能很好地完成日期运算。
因此,假设您需要在周日01:30每周运行一次流程。在美国的噩梦时刻..。它不会发生在春季的转换中,在秋季的转换中会发生两次。但您仍然希望进程只运行一次。
您要做的是:保留一个“下一个预定时间”值。每次运行作业时,计算下一次运行的“下一个计划时间”值。这可能是这样的:
var today = DateTime.Today.AddDays(7); /* midnight a week from now */
TimeSpan runTime = TimeSpan.Parse("01:30");
var nextRun = today + runTime;然后,保存nextRun DateTime值。稍后,您可以知道离下一次运行还有多长时间。这是个很好的方法。还有其他人。
var msUntilNextRun = (nextRun.Ticks - DateTime.Now.Ticks) / 10000;如果msUntilNextRun值显示得相当小且为正值,则可以睡觉,直到运行的时候。如果是小的和负的,你就睡过头--马上跑(睡过头是很常见的)。
将天数添加到当前的午夜值,然后添加时间,然后计算等待时间,这是一种即使在转换日期也能获得合理运行时的方法。
https://stackoverflow.com/questions/33487893
复制相似问题