2015-07-10 73 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