如果时间是凌晨1:00,请在C#中运行函数?
在C#中是否有一种方法,如果PC或系统中的时间显示为凌晨1:00,该功能将运行。我知道这可以通过使用定时器来实现,但我该怎么做呢?我现在正在修补的代码是:如果时间是凌晨1:00,请在C#中运行函数?,c#,winforms,timer,C#,Winforms,Timer,在C#中是否有一种方法,如果PC或系统中的时间显示为凌晨1:00,该功能将运行。我知道这可以通过使用定时器来实现,但我该怎么做呢?我现在正在修补的代码是: var t = new Timer { Enabled = true, Interval = 1 * 1000 }; t.Tick += delegate { mem_details(); }; 但是这段代码每1秒运行一次函数,我是否需要计算1:00AM到秒,这样我就可以使用这段代码来完成它 请看一下Quartz sched
var t = new Timer { Enabled = true, Interval = 1 * 1000 };
t.Tick += delegate { mem_details(); };
但是这段代码每1秒运行一次函数,我是否需要计算1:00AM到秒,这样我就可以使用这段代码来完成它 请看一下Quartz scheduler,我想它会有帮助的 下面是一个如何使用cron字符串为不同时间配置Quartz的示例:
您可以使用在线cron生成器选择所需的时间。请查看Quartz scheduler,我想它会有所帮助 下面是一个如何使用cron字符串为不同时间配置Quartz的示例:
您可以使用在线cron生成器选择所需的时间。既然您使用的是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);
}
}
}
}
}
既然你用的是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);
}
}
}
}
}
您可以使用计时器并在其中检查时间。比如说
var t=new Timer{Enabled=true,Interval=1*1000};
t、 勾选+=委托(对象发送者,事件参数e)
{
if(DateTime.Now.TimeOfDay.TotalHours>1&&DateTime.Now.TimeOfDay.TotalHours<2)
{
mem_details();
(发送方作为计时器)。已启用=错误;
}
};代码>您可以使用计时器并在其中检查时间。比如说
var t=new Timer{Enabled=true,Interval=1*1000};
t、 勾选+=委托(对象发送者,事件参数e)
{
if(DateTime.Now.TimeOfDay.TotalHours>1&&DateTime.Now.TimeOfDay.TotalHours<2)
{
mem_details();
(发送方作为计时器)。已启用=错误;
}
};代码>您可以随时使用Microsoft的反应式框架来实现这一点。其中的调度程序非常健壮
您可以编写以下代码:
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));
});
您可以随时使用Microsoft的反应式框架来实现这一点。其中的调度程序非常健壮
您可以编写以下代码:
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));
});
在此期间,您打算做什么?如果答案是否定的,那么最好使用windows任务计划程序在凌晨1:00(或之前不久)重新启动您的程序,不要浪费资源。@Damien_不相信它会在wcf服务中发送xml,所以我需要该应用程序每次都运行。这还不清楚。Damien在问你的应用程序是否在做其他事情,或者它只是在等待每天完成一项任务。@J。。。这只是一个功能,我的应用程序除了它之外还有其他功能。你可以运行另一个线程,它只会执行while(true){if(DateTime.Now.Hours==“1”)DoSomething();}
,但使用Windows调度程序还是比较明智的…你的代码在此期间将做什么?如果答案是否定的,那么最好使用windows任务计划程序在凌晨1:00(或之前不久)重新启动您的程序,不要浪费资源。@Damien_不相信它会在wcf服务中发送xml,所以我需要该应用程序每次都运行。这还不清楚。Damien在问你的应用程序是否在做其他事情,或者它只是在等待每天完成一项任务。@J。。。这只是一个功能,我的应用程序除了它之外还有其他功能。你可以运行另一个线程,它只会执行类似于的操作,而(true){if(DateTime.Now.Hours==“1”)DoSomething();}
,但使用Windows调度器还是比较明智的…实际上他不需要石英。石英是给爪哇的,实际上他不需要石英。Quartz是Java的,即使你要求一个1秒的计时器,也不能保证每秒只调用一次。有一种很小的可能性,您可能会在00:59:59
结束时获得时间,而下一次代码运行时,它会变成01:00:01
,这是正确的。您可以创建一个全局字符串变量,并将其设置为上次运行操作的日期。在计时器中,检查今天的日期是否与全局变量的日期不同。如果没有,那么只检查系统时间为“h:mm tt”。@HuH我怎么做?我改变了我的代码,包括@Damien_不信者的建议。我希望这能解释我的评论。即使你要求一个1秒的计时器,也不能保证你每秒会被准确地呼叫一次。有一种很小的可能性,您可能会在00:59:59
结束时获得时间,而下一次代码运行时,它会变成01:00:01
,这是正确的。您可以创建一个全局字符串变量,并将其设置为上次运行操作的日期。在计时器中,检查今天的日期是否与全局变量的日期不同。如果没有,那么只检查系统时间为“h:mm tt”。@HuH我怎么做?我改变了我的代码,包括@Damien_不信者的建议。我希望这能解释我的评论。我如何声明调度程序?我需要de吗