如果时间是凌晨1:00,用c#运行函数

本文关键字:运行 函数 时间 如果 | 更新日期: 2023-09-27 18:03:10

在c#中是否有一种方法,如果PC或系统中的时间说1:00AM,该函数将运行。我知道这可以实现使用定时器,但我怎么能做到呢?我现在正在修改的代码是:

var t = new Timer { Enabled = true, Interval = 1 * 1000 };
        t.Tick += delegate { mem_details(); };

但是这段代码每1秒运行一次函数,我需要计算1:00AM到秒吗?所以我可以使用这段代码?

如果时间是凌晨1:00,用c#运行函数

请看看Quartz调度器,我想它会有所帮助http://quartz-scheduler.org/

下面是一个如何使用cron字符串为不同时间配置Quartz的示例:http://quartz-scheduler.org/documentation/quartz-2.2.x/examples/Example3.

你可以使用在线的cron生成器来选择你需要的时间

你可以用微软的响应式框架来做这些。其中的调度程序非常健壮。

你可以这样写:

var start = DateTimeOffset.Now;
start = start.Date.AddHours(start.Hour == 0 ? 1.0 : 25.0);
/* start is now set for the next 1AM */
/* So schedule it */
Scheduler.Default.Schedule(start, reschedule =>
{
    /* Do you thing as it's now 1AM */
    /* And now reschedule to run tomorrow at 1AM */
    reschedule(DateTimeOffset.Now.Date.AddHours(25.0));
});

既然你使用的是1秒计时器,为什么不检查时间每滴答?

编辑:

好的,我稍微改变了一下我的代码。它仍然是一个1秒计时器(1000毫秒),但现在当计时器滴答事件触发时,它只看当前的小时和分钟。因此,如果您的程序运行得有点慢,它仍然会在凌晨1点运行您的进程。

全局变量"lastundate"存储最后一个进程运行的日期。这个需要在你的进程运行之前更新,以防你的进程需要超过一秒的时间来完成。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private String lastRunDate = "";
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 1000;
            timer1.Enabled = true;
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (lastRunDate != System.DateTime.Now.ToString("yyyy-MM-dd"))
            {
                String str = System.DateTime.Now.ToString("h:mm tt");
                if (str.Equals("1:00 AM"))
                {
                    lastRunDate = System.DateTime.Now.ToString("yyyy-MM-dd");
                    MessageBox.Show(str);                    
                }
            }
        }
    }
}

您可以使用计时器并在其中检查时间。例如

var t = new Timer { Enabled = true, Interval = 1 * 1000 }; t.Tick += delegate (object sender, EventArgs e) { if (DateTime.Now.TimeOfDay.TotalHours > 1 && DateTime.Now.TimeOfDay.TotalHours < 2) { mem_details(); (sender as Timer).Enabled=false; } };