Бегать раз в день - PullRequest
       37

Бегать раз в день

15 голосов
/ 11 ноября 2008

Есть ли какой-нибудь умный метод, чтобы мой executeEveryDayMethod () выполнялся один раз в день без использования Windows TaskScheduler?

Привет

/ Anders

Ответы [ 7 ]

16 голосов
/ 11 ноября 2008

Я добился этого, выполнив следующее ...

  1. Установите таймер, который срабатывает каждые 20 минут (хотя фактическое время зависит от вас - мне нужно было запускаться несколько раз в течение дня).
  2. на каждом событии Tick, проверьте системное время. Сравните время с запланированным временем выполнения для вашего метода.
  3. Если текущее время меньше запланированного, отметьте в некотором постоянном хранилище значение datetime в последний раз, когда метод выполнялся.
  4. Если метод последний раз запускался более 24 часов назад, запустите метод и сохраните дату и время этого прогона обратно в хранилище данных
  5. Если метод последний раз запускался в течение последних 24 часов, игнорируйте его.

НТН

* edit - пример кода в 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!");
        }
    }
}
8 голосов
/ 11 ноября 2008

Взгляните на quartz.net . Это библиотека планирования для .net.

Более конкретно, посмотрите здесь .

4 голосов
/ 11 ноября 2008

Если время его запуска не имеет значения и может быть сброшено при каждом запуске программы, вы можете просто установить таймер, что проще всего сделать. Если это неприемлемо, оно начинает усложняться, как решение, представленное здесь , и которое по-прежнему не решает проблему постоянства, вам нужно заняться этим отдельно, если вы действительно хотите делать то, что планируют задачи. Я действительно подумал бы еще раз, стоит ли преодолевать все трудности, чтобы воспроизвести совершенно хороший существующий функционал.

Вот связанный вопрос (Пример взят оттуда).

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);
    }
}
0 голосов
/ 17 июля 2018

Если вы хотите запускать его только один раз в день и не волнует, когда, это сработает (запустится сразу после полуночи).

Объявление переменной DateTime:

DateTime _DateLastRun;

В своем запуске установите начальное значение даты:

_DateLastRun = DateTime.Now.Date;

В области логики, где вы хотите проверить, следует ли выполнить действие:

if (_DateLastRun < DateTime.Now.Date) 
{
    // Perform your action
    _DateLastRun= DateTime.Now.Date;
}
0 голосов
/ 29 октября 2014

Чтобы запускать задание один раз в день с 7 до 20 часов, я установил таймер с интервалом = 3600000 мс, а затем просто выполнил следующий код для отметки времени.

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(); 
    }
 }
0 голосов
/ 11 ноября 2008

Могут возникнуть проблемы, если компьютер перезагрузится, чтобы вы могли запустить приложение в качестве службы Windows.

0 голосов
/ 11 ноября 2008

Вы можете запросить время и запустить, если у вас есть время, таким образом, даже если машина выключится, вы вызовете метод или воспользуетесь таймером, как советует Винко.

Но лучшее решение (схожее со старыми версиями CRON, поэтому его проверенный шаблон) состоит в том, чтобы иметь некоторые постоянные данные, а самое дешевое решение, которое я могу себе представить, - это пустой файл, проверить его последний измененный атрибут и, если он не был изменен в течение последних 24 часов, когда вы касаетесь его и запускаете свой метод. Таким образом, вы гарантируете, что метод запускается первым делом в случае, если приложение, например, на выходных.

Я делал это раньше в C #, но это было год назад на другой работе, поэтому у меня нет кода, но это было около 20 строк (с комментариями и всем) или около того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...