[英]Timer every 24 hours at a certain time
我想創建一個計時器,該計時器在特定時間每24小時調用一次方法。 我不想通過Windows Scheduler來執行此操作,而應該在代碼內完成。 這是我當前正在使用的代碼:
DateTime now = DateTime.Now;
DateTime today = now.Date.AddHours(16);
DateTime next = now <= today ? today : today.addDays(1);
Systems.Threading.TimerCallback callback = new TimerCallback(DisplayMessage);
Systems.Threading.Timer timer = new System.Threading.Timer(callback, null, next - now, TimeSpan.FromHours(24));
我的問題是,如果next
距離當前時間只有幾分鍾的路程,那么代碼將運行並通過DisplayMessage()
顯示消息。 如果時間差大於幾分鍾,則該代碼將不起作用,也不會出現異常,崩潰或任何其他情況。 我嘗試將日志語句,消息框和斷點放置在DisplayMessage()
,以確保能夠正確看到何時調用DisplayMessage()
,但是沒有運氣。
這是一個工作示例。
public class Scheduler {
private readonly List<Task> _Tasks;
private Timer _Timer;
public Scheduler() {
_Tasks = new List<Task>();
}
public void ScheduleTask(Task task) {
_Tasks.Add(task);
}
public void CancelTask(Task task) {
_Tasks.Remove(task);
}
//Start the timer.
public void Start() {
//Set the interval based on what amount of accurcy you need.
_Timer = new Timer {
Interval = 1000
};
_Timer.Elapsed += (sender, args) => UpdateTasks();
_Timer.Enabled = true;
}
//Check to see if any task need to be executed.
private void UpdateTasks() {
for (int i = 0; i < _Tasks.Count; i++) {
Task task = _Tasks[i];
if (task.ExecuteTime >= DateTime.Now) {
task.Callback();
_Tasks.Remove(task);
}
_Tasks.Remove(task);
}
}
//Stop the timer when you are done.
public void Stop() {
_Timer.Dispose();
}
}
//Use this to schedule a task.
public class Task {
public DateTime ExecuteTime { get; set; }
public Action Callback { get; set; }
public Task(DateTime executeTime, Action callback) {
ExecuteTime = executeTime;
Callback = callback;
}
}
我認為更好的解決方案是使時間每秒觸發並檢查時間和您想要的任何東西,我認為每秒觸發它並不昂貴。 每24小時觸發一次不是正常使用計時器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.