每天跑一次

是否有任何聪明的方法可以让我的executeEveryDayMethod()每天执行一次,而不必涉及Windows TaskScheduler?

问候

/安德斯

看看quartz.net 。 它是.net的调度库。

更具体地来看看这里 。

我通过以下方式实现了这一目标……

  1. 设置一个每20分钟触发一次的计时器(虽然实际时间由你决定 – 我需要在一天中多次运行)。
  2. 在每个Tick事件中,检查系统时间。 将时间与方法的计划运行时间进行比较。
  3. 如果当前时间小于计划时间,请检查某个持久存储中的某个以获取上次运行该方法的日期时间值。
  4. 如果方法最后运行超过24小时,请运行该方法,并将此运行的日期时间存储回数据存储
  5. 如果该方法在过去24小时内最后运行,请忽略它。

HTH

*编辑 – C#中的代码示例::注意:未经测试…

using System; using System.Collections.Generic; using System.Text; using System.Timers; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Timer t1 = new Timer(); t1.Interval = (1000 * 60 * 20); // 20 minutes... t1.Elapsed += new ElapsedEventHandler(t1_Elapsed); t1.AutoReset = true; t1.Start(); Console.ReadLine(); } static void t1_Elapsed(object sender, ElapsedEventArgs e) { DateTime scheduledRun = DateTime.Today.AddHours(3); // runs today at 3am. System.IO.FileInfo lastTime = new System.IO.FileInfo(@"C:\lastRunTime.txt"); DateTime lastRan = lastTime.LastWriteTime; if (DateTime.Now > scheduledRun) { TimeSpan sinceLastRun = DateTime.Now - lastRan; if (sinceLastRun.Hours > 23) { doStuff(); // Don't forget to update the file modification date here!!! } } } static void doStuff() { Console.WriteLine("Running the method!"); } } } 

如果它运行的时间不相关,并且每次程序启动时都可以重置,你可以设置一个计时器,这是最简单的事情。 如果这是不可接受的,它开始变得越来越复杂,就像这里提出的解决方案仍然无法解决持久性问题,如果你真的希望做那些计划任务,你需要单独解决这个问题。 我真的会再次考虑是否值得经历所有麻烦来复制一个完美的现有function。

这是一个相关的问题 (从那里取的例子)。

 using System; using System.Timers; public class Timer1 { private static Timer aTimer = new System.Timers.Timer(24*60*60*1000); public static void Main() { aTimer.Elapsed += new ElapsedEventHandler(ExecuteEveryDayMethod); aTimer.Enabled = true; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); } // Specify what you want to happen when the Elapsed event is // raised. private static void ExecuteEveryDayMethod(object source, ElapsedEventArgs e) { Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); } } 

您可以在一段时间内查询时间并运行,即使机器关闭,您也可以调用方法或使用像Vinko建议的计时器。

但更好的解决方案(类似于旧的CRON版本,因此它是一个经过validation的模式)是拥有一些持久性数据,我现在可以想到的最便宜的解决方案是一个空白文件,检查它的最后修改属性,如果它没有’在您触摸它的最后24小时内进行了修改并运行您的方法。 这样,您可以确保方法在应用程序周末出现的情况下首先运行。

我之前在C#中做过这个,但是它是一年前在另一个Job上做的,所以我没有代码,但它大约有20行(带注释和所有)左右。

如果计算机重新启动可能会出现问题,因此您可以将应用程序作为Windows服务运行。

为了在7到8pm之间每天运行一次作业,我设置了一个间隔= 3600000 ms的计时器,然后执行以下代码进行计时器滴答。

 private void timer1_Tick(object sender, EventArgs e) { //ensure that it is running between 7-8pm daily. if (DateTime.Now.Hour == 19) { RunJob(); } } 

一小时的窗户对我来说很好。 时间上的额外粒度将需要较小的计时器间隔(60000一分钟)并包括if上的分钟。

例如

 { //ensure that it is running at 7:30pm daily. if (DateTime.Now.Hour == 19 && DateTime.Now.Minute == 30) { RunJob(); } } 

如果你只想每天运行一次并且不关心什么时候,这将起作用(将在午夜之后运行)。

声明一个DateTime变量:

 DateTime _DateLastRun; 

在启动时,设置初始日期值:

 _DateLastRun = DateTime.Now.Date; 

在要检查是否执行操作的逻辑区域中:

 if (_DateLastRun < DateTime.Now.Date) { // Perform your action _DateLastRun= DateTime.Now.Date; }