我需要在每个月底启动一个计时器。我编写了一个小程序,其中包含需要在每个月的最后一天执行的代码,但我不知道如何实现它。我向我的老板建议使用 Windows 调度程序,但他希望使用计时器在代码中完成。
那么我该怎么做呢?
我设法说服老板使用windows计划任务。有一种方法可以用计时器来做到这一点。我在下面包含代码。它又快又脏。请注意,使用计划任务是实现此类任务的正确方法。
private Timer timer;
public MyClass()
{
timer = new Timer();
timer.Elapsed += TimerElapsed;
}
private void TimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
if (DateTime.Now.Day == DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month))// is it the last day of this month
{
ClientStatsController.FireAll();
}
Thread.Sleep(TimeSpan.FromMinutes(5));
timer.Interval = CalculateInterval();
TimeSpan interval = new TimeSpan(0, 0, 0, 0, (int)timer.Interval);
}
// Helper functions
private static TimeSpan From24HourFormat(string value)
{
int hours = Convert.ToInt32(value.Substring(0, 2));
int mins = Convert.ToInt32(value.Substring(2, 2));
return TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(mins);
}
private double CalculateInterval()
{
string runtimeValue = ConfigController.AppSettings["runTime"]; // just a simple runtime string like 0800
double runTime = From24HourFormat(runtimeValue).TotalMilliseconds;
if (DateTime.Now.TimeOfDay.TotalMilliseconds < runTime)
{
return runTime - DateTime.Now.TimeOfDay.TotalMilliseconds;
}
else
{
return (From24HourFormat("2359").TotalMilliseconds - DateTime.Now.TimeOfDay.TotalMilliseconds) + runTime;
}
}
编辑
我开始浏览我所有的旧问题和答案。
使用计时器是一个非常糟糕的主意。对于您想要使用的计划任务。一个调度器。Windows 提供了不错的任务调度器,但如果你有更复杂的调度逻辑和后台任务,最好使用合适的第三方库。
.NET 的两个杰出的是 Hangfire 和 Quartz。
Hangfire 带有完整的仪表板,并且非常易于实现,特别是如果您在 .NET 核心平台上工作。
Quartz 也是一个非常不错的解决方案,它有更多的调度选项,比 Hangfire 更适合复杂的调度逻辑。
提议的解决方案确实很糟糕,来自一个刚开始工作的实习生。我很高兴回到过去,意识到事情可以如何以不同的方式做得更好。