如果时间是凌晨1点运行C#中的功能?

时间:2014-05-14 07:23:55

标签: c# winforms timer

在C#中是否存在一种方式,如果PC或系统中的时间表示上午1:00该功能将运行。我知道这可以通过计时器实现,但我该怎么做呢?我现在修补的代码就是:

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

但是这段代码每1秒运行一次,我需要计算凌晨1点到秒,所以我可以使用这段代码吗?

4 个答案:

答案 0 :(得分:2)

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

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

您可以使用在线cron生成器来选择所需的时间。

答案 1 :(得分:2)

您可以随时使用Microsoft的Reactive Framework来执行此操作。那里的调度程序非常强大。

您可以编写此代码:

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));
});

答案 2 :(得分:1)

由于您使用1秒计时器,为什么不检查每个滴答的时间?

编辑:

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

全局变量“lastRunDate”存储上次进程运行的日期。这需要在您的流程运行之前进行更新,以防您的流程花费超过一秒的时间来完成。

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);                    
                }
            }
        }
    }
}

答案 3 :(得分:1)

您可以使用计时器和检查时间。例如

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; } };