我正在编写一个每周触发一次的应用程序。 我将到期时间设定为星期日下午5点。但是,对于这个时间间隔,如何将其重置为下一个星期日下午5点?
例如,如果我在周日下午4:59:50开始我的应用程序,那么第一次回调将在预期的下午5点正确,但是从现在起我需要设置一个间隔,该间隔将在下周日的下午5点左右设置。 / p>
我正在避免的2种技巧: 1.我可以手动键入(1000 * 60 * 60 * 24 * 7)以便在计时器上获得一周的间隔,但是由于计时器基于计时器滴答而不是实时,我知道这可能是导致程序每周不足几秒钟。 2.在我的Callback方法结束时,我可以回想起调度程序。
我想要做的是在发送回调后通过调用我的调度程序方法中的代码,在晚上5点重置大约为下一个星期日设置的时间间隔。 此方法可能仍会因为滴答而遭受丢失时间,但由于它会在代码中每周重置一次,因此误差幅度将小于执行硬编码间隔,并且代码将比使用从中调用调度程序的做法更清晰回调方法。
public void MyScheduler()
{
// trigger initial time to first day of the week (Sunday) at 5PM
DateTime markedTime = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek).AddHours(17);
//If not already sunday, increment to the next sunday
if (DateTime.Now > markedTime)
{
markedTime = markedTime.AddDays(7);
}
// initialize callback , set start time, then set interval
myTimer = new System.Threading.Timer(sender => CallbackMethod(variables passed), null,
(int)(markedTime - DateTime.Now).TotalMilliseconds,Timeout.Infinite);
}
答案 0 :(得分:1)
我最喜欢的图书馆之一是FluentScheduler。它对我来说简化了调度任务。在你的情况下,我想以下的东西可以正常工作:
public class MyRegistry : Registry
{
public MyRegistry()
{
Schedule(() =>
{
// Do something
}).ToRunEvery(1).Weeks().On(DayOfWeek.Sunday).At(17, 0);
}
}
你可以在Nuget
上得到它Install-Package FluentScheduler