背景工作人员在午夜时检查?

我想为WinForm创建一个后台工作程序,每当午夜滚动时触发代码。

我知道如何做到这一点,但我很确定这不是最好的方法。

while(1==1) { //if Datetime.Now == midnight, execute code //sleep(1second) } 

使用System.Timers.Timer并在应用程序启动时只计算DateTime.NowDateTime.Today.AddDays(0)之间的差异。 然后设置该金额的间隔。

我最近做了这样的事情:

 public static class DayChangedNotifier { private static Timer timer; static DayChangedNotifier() { timer = new Timer(GetSleepTime()); timer.Elapsed += (o, e) => { OnDayChanged(DateTime.Now.DayOfWeek); timer.Interval = this.GetSleepTime(); }; timer.Start(); SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged); } private static void SystemEvents_TimeChanged(object sender, EventArgs e) { timer.Interval = GetSleepTime(); } private static double GetSleepTime() { var midnightTonight = DateTime.Today.AddDays(1); var differenceInMilliseconds = (midnightTonight - DateTime.Now).TotalMilliseconds; return differenceInMilliseconds; } private static void OnDayChanged(DayOfWeek day) { var handler = DayChanged; if (handler != null) { handler(null, new DayChangedEventArgs(day)); } } public static event EventHandler DayChanged; } 

和:

 public class DayChangedEventArgs : EventArgs { public DayChangedEventArgs(DayOfWeek day) { this.DayOfWeek = day; } public DayOfWeek DayOfWeek { get; private set; } } 

DayChangedNotified.DayChanged += ....DayChangedNotified.DayChanged += ....

相反,您可以使用Timer并将计时器滴答间隔设置为Now()和午夜之间的时间。

你可以使用Quartz来安排。 在这种情况下,也许就像是用来杀死蚊子的大炮,但这是我所知道的唯一的调度工作框架并且工作得很好。

不要使用民意调查。 而是设置一个计时器任务,将其设置为在午夜点火,并添加一个事件进行处理。

  TimeSpan timeBetween = DateTime.Today.AddDays(1) - DateTime.Now; System.Timers.Timer t = new System.Timers.Timer(); t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed); t.Interval = 1000 * timeBetween.Seconds; t.Start(); 

我不清楚为什么微软在几年前通过添加一个Windows服务来处理时序来解决这类问题时,投票解决方案被投票了。 只需创建一个计划任务来运行exe。 没有额外的开销。

我对你为什么需要一个WinForm有点困惑,它会在午夜运行吗? 如果您只需要运行某个排序过程,请使用Windows调度程序在午夜运行它。 (在XP上,但我相信Win服务器应该类似)控制面板 – >计划任务 – >添加计划任务 – >填写向导。 为您节省大量编码。