Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果时间是凌晨1:00,请在C#中运行函数?_C#_Winforms_Timer - Fatal编程技术网

如果时间是凌晨1:00,请在C#中运行函数?

如果时间是凌晨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

在C#中是否有一种方法,如果PC或系统中的时间显示为凌晨1:00,该功能将运行。我知道这可以通过使用定时器来实现,但我该怎么做呢?我现在正在修补的代码是:

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吗