我正在开发一个必须在一天中的某些时间执行某些操作的控制台应用程序(我澄清它不是服务,因为我需要执行进程)
问题是我必须在某个时间启动应用程序并在另一个时间关闭它。
搜索时,我找到了一个关于 SO 的英文答案,该答案与我正在寻找的内容类似,但通过一次执行,我尝试对代码段进行如下修改:
private void SetUpTimer(TimeSpan alertTime, DateTime current, Action<TimeSpan> delg)
{
TimeSpan timeToGo = alertTime - current.TimeOfDay;
if (timeToGo < TimeSpan.Zero)
{
return;//time already passed
}
this.timer = new System.Threading.Timer(x =>
{
delg(alertTime);
}, null, timeToGo, Timeout.InfiniteTimeSpan);
}
public void OpenProcess(TimeSpan alertTime)
{
Console.WriteLine("Ejecutado {0}",DateTime.Now);
SetUpTimer(alertTime, DateTime.Now.AddDays(1), OpenProcess);
}
然后我称之为如下
SetUpTimer(new TimeSpan(13, 44, 00), DateTime.Now, OpenProcess);
第一次正确执行,但第二次,OpenProcess() 函数不执行。
我的错误在哪里?
谢谢!
在您的代码
timeToGo
中,它标记了计时器再次运行的剩余时间,并定义为一个TimeStamp
(alertTime
) 与另一个 (current.TimeOfDay
) 的减法。当您
SetUpTimer(alertTime, DateTime.Now.AddDays(1), OpenProcess);
从调用时会发生什么OpenProcess
?您使用
AddDays
的内容无关紧要,因为要计算您使用的时间TimeOfDay
而不考虑日期,并且您还应该在计时器滴答应该跳跃的同时调用它,这实际上timeToGo
给出了否定结果,并且在逻辑上它第二天不会再开火。我已经在评论中告诉过你,我认为对这些任务使用 windows 计划任务会更好,但如果你坚持这条路,我会给你一个解决方案。
解决方案是使用日期而不是 TimeStamps 来计算再次触发计时器滴答的剩余时间,如下所示:
第一次调用它,像这样(如果它在你安排它的时间之前):
OpenProcess
它会是这样的:我认为最好的方法是实现工人的概念。您必须让您的控制台应用程序立即执行所需的操作,而不检查时间或日期,然后通过操作系统安排重复任务。对于 Microsoft Windows,您可以使用任务计划程序 - 创建基本任务 - 声明任务执行的频率 - 操作 = 启动程序,查找控制台应用程序并准备就绪。