【发布时间】:2013-09-14 04:41:37
【问题描述】:
我想创建一个计时器,在特定时间每 24 小时调用一次方法。我不想通过 Windows 调度程序执行此操作,而是应该在代码中完成。这是我目前正在使用的代码:
DateTime now = DateTime.Now;
DateTime today = now.Date.AddHours(16);
DateTime next = now <= today ? today : today.addDays(1);
Systems.Threading.TimerCallback callback = new TimerCallback(DisplayMessage);
Systems.Threading.Timer timer = new System.Threading.Timer(callback, null, next - now, TimeSpan.FromHours(24));
我的问题是,如果 next 最终距离当前时间只有几分钟的路程,那么代码将起作用并通过 DisplayMessage() 显示消息。如果时间差大于几分钟,则代码不起作用,没有异常、崩溃或任何情况。我尝试在DisplayMessage() 中放置日志语句、消息框和断点,以确保我能够正确看到何时调用DisplayMessage(),但没有运气。
【问题讨论】:
-
你有没有看过 Quartz.net。
-
显而易见的第一个问题:在回调之前,您是否持有对
timer的引用?这是防止它被 GC 所必需的。 -
@McGarnagle 可能就是这样,明天我会尝试并报告。这就解释了为什么它可以在更短的时间内发挥作用。
-
很好奇,但只是为什么您不想为此使用计划任务?这就是计划任务更多的原因,并且每天使用服务执行一次操作是一种味道。
-
@McGarnagle 就是这样,谢谢