Пробег один раз в день

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

Привет

/Anders

Ответы

Ответ 1

Посмотрите quartz.net. Это библиотека планирования для .net.

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

Ответ 2

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

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

НТН

* edit - образец кода в С#:: Примечание: непроверенный...

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!");
        }
    }
}

Ответ 3

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

Вот вопрос (Пример оттуда).

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Чтобы запустить задание один раз в день между 7 и 8 вечера, я настроил таймер с интервалом = 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(); 
    }
 }