Я ниже код, который прекрасно работал со мной, и работать параллельно, требуемые задачи в определенное время, то есть midnigh в моем случаеC# Invoke группа задач в определенное время
using System;
using System.Threading.Tasks;
namespace COREserver{
public static partial class COREtasks{ // partial to be able to split the same class in multiple files
public static async void RunSheduledTasks_12AM(){
TimeSpan MIDNIGHT = new TimeSpan(0,00,00,00,000); //set when run event (ex. 18:16:53.123)
DateTime endDate = DateTime.Today.Add(MIDNIGHT);
if(endDate<DateTime.Now) endDate = endDate.AddDays(1.0);
while (true)
{
TimeSpan duration = endDate.Subtract(DateTime.Now);
if(duration.TotalMilliseconds <= 0.0)
{
#region MIDNIGHT Tasks
Parallel.Invoke(
() => task1(),
() => task2(),
() => task3()
);
#endregion MIDNIGHT Tasks
endDate = endDate.AddDays(1.0);
continue;
}
int delay = (int)(duration.TotalMilliseconds/2);
await Task.Delay(delay>0?delay:0);
}
}
}
}
Я обнаружил, что мне нужно сделать то же самое с другим периодом времени, например, время начала работы (7:00), в середине дня и в конце рабочего дня (5:00 PM)
Есть ли способ избегайте повторного кодирования все, что-то вроде функции обратного вызова, поэтому я могу назвать свои задачи примерно такими:
midnight(MIDNIGHT, task1, task2,...)
midday("12:00:00", task5, task6, ..)
или что-то вроде:
switch(time){
casse MIDNIGHT: .. run task1, task2,..
case "12:00:00": .. run task5, task6,..
}
Благодаря
Почему бы не использовать 'Quartz.NET' или какое-либо другое хорошо установленное решение для планирования? –
Вы можете создать разные рабочие классы для каждой из задач и настроить время их расписания в config. Как только ваш exe запускает каждый рабочий, он инициирует и проверяет свое расписание, и если пришло время запуска, они будут запускать еще и перейти в состояние сна до следующего запланированного времени. Вы также можете отключить их на основе конфигурации. –