在C#中是否存在一种方式,如果PC或系统中的时间表示上午1:00该功能将运行。我知道这可以通过计时器实现,但我该怎么做呢?我现在修补的代码就是:
var t = new Timer { Enabled = true, Interval = 1 * 1000 };
t.Tick += delegate { mem_details(); };
但是这段代码每1秒运行一次,我需要计算凌晨1点到秒,所以我可以使用这段代码吗?
答案 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;
}
};