在特定时间执行C#函数

6
我做了一个小的Windows Forms程序来自动备份磁盘上的一些文件。目前我需要在执行之前按一个按钮,但我想让程序在运行时,在凌晨3点运行执行备份的功能。
我进行了一些研究,发现我需要使用计时器,但我无法让它在特定时间执行。
希望你能帮助我。 :-)
谢谢!
6个回答

3
你可以使用:System.Forms.Timer 如果你不知道需要多长时间执行某项任务,可以采用以下方法:
DateTime TimeToExecuteTask
DateTime Now = DateTime.Now // assign values.

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

3

虽然不是完全的重复,但您会发现这个问题很有趣。;)

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


2

一种选择是使用计时器。这需要你的程序一直运行。

如果你想使用计时器,那么将其设置为触发(例如每秒触发一次)。

myTimer.Interval = 1000;

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

2
您可以使用Windows中的任务计划程序来设置在特定时间运行程序。请查看此链接:this link。它提到了内置的Windows备份,但您也可以用它来运行自己的程序。
实际上,这个link到AT命令可能更好。
我知道您正在寻找编程解决方案(其他人已经发布了如何使用计时器的帖子),但使用AT命令安排任务的优点是您的程序不需要一直在系统上运行。任务计划程序将在正确的时间启动您的程序,它可以执行完毕后退出。您可能需要稍微调整一下程序,让它自动备份并退出,但这应该是可行的。

1
这是我在处理不需要程序一直运行的任务时的首选解决方案。 - Thorsten Dittmar

1

很抱歉这么多年后才回答。我觉得我的帖子可能会在以后帮助到某些人。这里是一个小代码,用于模拟定时任务。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接