定时器每 24 小时在特定时间

本文关键字:定时间 小时 定时器 | 更新日期: 2023-09-27 18:31:19

我想创建一个计时器,该计时器每 24 小时在特定时间调用一个方法。我不想通过Windows调度程序执行此操作,而是应该在代码中完成。这是我当前使用的代码:

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(),但没有运气。

定时器每 24 小时在特定时间

这是一个工作示例。

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 小时进行一次三重奏不是计时器的正常使用