C#在特定时间执行功能

时间:2009-11-05 15:54:44

标签: c# winforms timer

我制作了一个Windows Forms程序来对磁盘上的某些文件进行一些自动备份。现在我需要在执行之前按下一个按钮,但我想让程序运行,并在凌晨3点运行执行备份的功能。

我研究了一下,发现我需要一个计时器,但我没有使用它,所以它在特定的时间执行。

我希望你能帮助我。 : - )

谢谢!

6 个答案:

答案 0 :(得分:4)

不是100%的欺骗,但你会发现this SO question有趣。 ;)

包含对quartzTimer和其他选项的引用。

答案 1 :(得分:2)

您可以使用: System.Forms.Timer

如果您不知道要执行的时间,请执行以下操作:

DateTime TimeToExecuteTask
DateTime Now = DateTime.Now // assign values.

int SecondsToExectution = (TimeSpan)(TimeToExecuteTask - Now).TotalSeconds;

答案 2 :(得分:2)

一种选择是使用计时器。这要求您的程序继续运行。

如果您想使用计时器,请将其设置为触发(例如,每秒一次)

myTimer.Interval = 1000;

在调用的委托函数中,将当前时间与目标时间进行比较,如果匹配,则启动备份过程。

答案 3 :(得分:2)

您可以使用Windows中的任务计划程序将程序设置为在特定时间运行。查看this link。它指的是内置的Windows备份,但没有理由不能让它运行自己的程序。

实际上,AT命令的这个link可能会更好。

我知道你正在寻找一个编程解决方案(还有其他几个人已经发布了如何使用计时器)但是使用AT命令安排某些事情的好处是你的程序不需要继续在系统上运行所有的时间。任务计划程序将在正确的时间启动您的程序,它可以执行然后退出。您可能需要稍微调整一下程序以使其自动备份然后退出,但这应该是可能的。

答案 4 :(得分:0)

很抱歉在这么多年后发布了答案。我觉得我的帖子可能会帮助一些人。这是一个用计时器模拟计划任务的小代码。

using System;
using System.Timers;

namespace ScheduleTimer
{
    class Program
    {
        static Timer timer;

        static void Main(string[] args)
        {
            schedule_Timer();
            Console.ReadLine();
        }

        static void schedule_Timer()
        {
            Console.WriteLine("### Timer Started ###");

            DateTime nowTime = DateTime.Now;
            DateTime scheduledTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 8, 42, 0, 0); //Specify your scheduled time HH,MM,SS [8am and 42 minutes]
            if (nowTime > scheduledTime)
            {
                scheduledTime = scheduledTime.AddDays(1);
            }

            double tickTime = (double)(scheduledTime - DateTime.Now).TotalMilliseconds;
            timer = new Timer(tickTime);
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Start();
        }

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("### Timer Stopped ### \n");
            timer.Stop();
            Console.WriteLine("### Scheduled Task Started ### \n\n");
            Console.WriteLine("Hello World!!! - Performing scheduled task\n");
            Console.WriteLine("### Task Finished ### \n\n");
            schedule_Timer();
        }
    }
}

屏幕截图

enter image description here

答案 5 :(得分:0)

    //Perhaps the following is a more suitable solution consume the following

    public class DailyTrigger
    {  
        readonly TimeSpan triggerHour;

        public DailyTrigger(int hour, int minute = 0, int second = 0)
        {
          triggerHour = new TimeSpan(hour, minute, second);
          InitiateAsync();
        }

        async void InitiateAsync()
        {
          while (true)
          {
            var triggerTime = DateTime.Today + triggerHour - DateTime.Now;
            if (triggerTime < TimeSpan.Zero)
              triggerTime = triggerTime.Add(new TimeSpan(24, 0, 0));
            await Task.Delay(triggerTime);
            OnTimeTriggered?.Invoke();
          }
        }

        public event Action OnTimeTriggered;
      }


   // as Follows

     var trigger = new DailyTrigger(17); // every day at 5:00pm

          trigger.OnTimeTriggered += () =>
          {
            //Do Logic
          };