2017-01-16 3 views
0

Я ниже код, который прекрасно работал со мной, и работать параллельно, требуемые задачи в определенное время, то есть 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,.. 

}

Благодаря

+2

Почему бы не использовать 'Quartz.NET' или какое-либо другое хорошо установленное решение для планирования? –

+0

Вы можете создать разные рабочие классы для каждой из задач и настроить время их расписания в config. Как только ваш exe запускает каждый рабочий, он инициирует и проверяет свое расписание, и если пришло время запуска, они будут запускать еще и перейти в состояние сна до следующего запланированного времени. Вы также можете отключить их на основе конфигурации. –

ответ

2

Помимо использования готового решения, как Quartz.NET (как это было предложено Стивену в комментариях к вашему вопросу), вы могли бы просто передать ваше время начала и список задач в качестве параметров для вашего метода:

public static async void RunSheduledTasks(TimeSpan endTime, params Action[] tasks) 
{ 
    DateTime endDate = DateTime.Today.Add(endTime); 
    if (endDate < DateTime.Now) 
     endDate = endDate.AddDays(1.0); 
    while (true) 
    { 
     TimeSpan duration = endDate.Subtract(DateTime.Now); 
     if(duration.TotalMilliseconds <= 0.0) 
     { 
      Parallel.Invoke(tasks); 
      endDate = endDate.AddDays(1.0); 
      continue; 
     } 
     int delay = (int)(duration.TotalMilliseconds/2); 
     await Task.Delay(delay > 0 ? delay : 0); 
    } 
} 

Вы coul d затем назовем это следующим образом:

await COREtasks.RunSheduledTasks(new TimeSpan(0,00,00,00,000), 
           () => Console.WriteLine("Test1"), 
           () => Console.WriteLine("Test2")); 
+0

спасибо, отлично поработал –