2015-07-10 77 views
0

我在写一个每周触发一次的应用程序。 我设置了计时器,在周日下午5点关闭。但是,如何间隔时间,我如何重置它以在下星期日下午5点关闭?动态调度程序间隔C#

例如,如果我在星期日下午4:59:50开始我的应用程序,那么第一个回调将在预期的5PM处正确,但是现在我需要设置一个时间间隔,该时间间隔将在接下来的周日下午5点设置。

2我要回避的技巧: 1.我可以手动输入(1000 * 60 * 60 * 24 * 7)以使间隔在定时器上成为一周,但由于定时器的基础在计时器滴答而不是实时我知道这可能会导致该计划每周下降几秒钟。 2.在我的回调方法结束时,我可以调用Scheduler Procedure。

我想要做的是重置时间间隔大约设置为下午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

什么是错的使用Windows任务调度? – Zman101

回答

1

我最喜欢的图书馆之一是FluentScheduler。它为我简化了调度任务。在你的情况我估计像下面这样就很好地工作:

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     Schedule(() => 
     { 
      // Do something 
     }).ToRunEvery(1).Weeks().On(DayOfWeek.Sunday).At(17, 0); 
    } 
} 

你可以得到它的NuGet

Install-Package FluentScheduler