c# - 每 24 小时定时一次

标签 c# timer

我想创建一个计时器,它在特定时间每 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;
    }
}

关于c# - 每 24 小时定时一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794435/

相关文章:

c# - Visual Studio - 不能多次构建一个简单的项目

c# - Android 上的 Base64 编码/解码

c# - Dapper 和 Varbinary(max) 流参数

ios - 如何在几秒钟后停止计时器

php - 如何从数据库中获取时间总和?

javascript - 如何通过 jquery 检查启用链接按钮?

c# - 接口(interface)中的 ICollection 与另一个接口(interface)作为类型

c++ - 以下程序的格式说明符可能是什么?

java - 沿着路径移动对象: How to call actionPerformed only after previous actionPerformed has finished?

javascript - 倒计时和指定休息后恢复计时器