1

Тема: Виконання методу в заданий час кожного дня

Всім привіт. Потрібна написати код щоб кожного дня в певний час виконувався метод. Шукав інформацію знайшов що можна зробити таймером, але це трохи мені не підходить тому що після перезапуска програми таймер стартує заново. Хто може порекомендувати як це краще реалізувати? ось код з таймером

static void Main(string[] args) {
    SetTimer();
    Console.ReadLine();
    aTimer.Stop();
    aTimer.Dispose();
}
private static void SetTimer() {
    aTimer = new System.Timers.Timer(86400000);
    aTimer.Elapsed += OnTimedEvent;
    aTimer.AutoReset = true;
    aTimer.Enabled = true;
}
private static void OnTimedEvent(object sender, ElapsedEventArgs e) {
    Console.WriteLine(e.SignalTime);
    AddReward();
}

По цьому коду все працює виконується AddReward таймер 86400000 це є 24 години і кожні 24 години спрацьовує, але цей таймер залежить від часу запуску, або перезапуску програми.
Мені потрібно щось типу такого.

float Hours = 09;
float Minutes = 00;
if (DateTime.Now.Hour == Hours && DateTime.Now.Minute == Minutes) {
    AddReward();
}

Буду вдячний за допомогу

2

Re: Виконання методу в заданий час кожного дня

Одразу питання: у вас є застосунок, що постійно працює в пам'яті, і треба якусь процедуру запускати в певний час; або всю вашу програму треба запускати в певний час?
У першому разі розраховуйте час від поточного моменту до найближчого часу запуску і ставте таймер на цей період (і перестворюйте таймер при кожному запуску).
У другому разі вам потрібно налаштовувати OS - Task Scheduler в Windows чи cron у *nix.

Подякували: leofun01, kinachuk19902

3

Re: Виконання методу в заданий час кожного дня

Може простіше буде запланувати завданя через cron або taskschd.msc ? Для старту останнього маю такий рядок:

pushd %WinDir%\System32\ && mmc.exe taskschd.msc && popd

, а далі за прикладом.

Якщо завданя треба стартувати тільки самим C#, тоді програма мусить крутитися в системі цілодобово, цього не уникнути, і бажано з великими Sleep() між основною роботою. Якщо хочеш приховати вікно програми, то можна компільнути програму як бібліотеку і зареєструвати її в системі як демон або сервіс.
Або ще можна компільнути програму як "Windows Forms Application" але без "Application Context" і без Application.Run(), тоді програму можна буде стартувати, і користувач її не побачить, тільки список процесів (taskmgr.exe) буде світити +1 рядок [як мінімум].

Якщо іноді треба вбивати процеси програми, то періодично програма мусить писати час основної роботи в файл, і після старту програма має читати той самий файл.
Ще є опція писати в рейестр, але він часто не доступний.

4

Re: Виконання методу в заданий час кожного дня

В мене застосунок працює постійно. Консольний  застосунок і мені просто потрібно щоб він кожного дня в певний час виконував метод AddReward() незалежно коли запущений застосунок

Подякували: leofun011

5

Re: Виконання методу в заданий час кожного дня

float Hours = 09;
float Minutes = 00;
if (DateTime.Now.Hour == Hours && DateTime.Now.Minute == Minutes) {
    AddReward();
}

Чи можна в цьому випадку таймер на хвилину? Чи не пропустить він виконання методу, або двічі його не виконає?

6

Re: Виконання методу в заданий час кожного дня

Ну у вас же проблема з перезапуском? От якщо програма виконає дію і перезапуститься в межах однієї хвилини, що станеться? Правильно, дію буде виконано двічі. А якщо програму вб'ють до дії і перезапустять після потрібної хвилини, що тоді? Чекати на наступну добу?
Вам треба зберігати стан (виконана операція - не виконана) у чомусь постійному (файл, БД), і виконувати дію при запуску, якщо вона була пропущена, а якщо ні - то ставити очікування до наступної дії.

7

Re: Виконання методу в заданий час кожного дня

Можна розглянути, як варіант, бібліотеку Quartz.NET:
https://www.quartz-scheduler.net/docume … start.html