Уменьшить загрузку ЦП при ложном условии

#c# #optimization #while-loop #time-complexity #cpu-usage

#c# #оптимизация #цикл while #сложность по времени #загрузка процессора

Вопрос:

Я разрабатываю приложение, которое запускается каждый день в определенное время, я использовал цикл while внутри, когда внутри условия цикла false Процессору требуется много времени и ресурсов для обработки, как я уменьшаю загрузку ЦП, когда внутри условия цикла false.

 while (true)    // run everyday without stop
{
    IntPtr hwnd;                           // hide command prompt file
    hwnd = GetConsoleWindow();            // 
    ShowWindow(hwnd, SW_HIDE);            //
    
    TimeSpan startMor= new TimeSpan(int.Parse(SHP1), int.Parse(SMP1), 0);     // set the hours and minutes 
    TimeSpan endMor = new TimeSpan(int.Parse(EHP1), int.Parse(EMP1), 0);      // 
    TimeSpan startEve = new TimeSpan(int.Parse(SHP2), int.Parse(SMP2), 0);   //
    TimeSpan endEve = new TimeSpan(int.Parse(EHP2), int.Parse(EMP2), 0);     //
    TimeSpan now = DateTime.Now.TimeOfDay;          // current time of day
    var hour = DateTime.Now.Hour;                    // current hours,  set to check 
    var minutes = DateTime.Now.Minute;               // current minutes, set to check

    // hour to minutes conversion 
    int minutesProcess1 = ((int.Parse(EHP1) - (int)hour) * 60)   int.Parse(EMP1) - (int)minutes;       // process 1 conversion 
    int minutesProcess2 = ((int.Parse(EHP2) - (int)hour) * 60)   int.Parse(EMP2) - (int)minutes;      // process 2 conversion

    //int time_to_process = 1;

    if ((now >= startMor) amp;amp; (now < endMor))
    {
       // var process1 = Process.Start("notepad.exe");
        var process1 = Process.Start(path_1);
        Thread.Sleep(1000 * 60 * 1 * minutesProcess1);                
        //process.WaitForExit(10000);
        process1.Kill();
    } 
    else if((now >= startEve) amp;amp; (now < endEve))
    {
        var process2 = Process.Start(path_2);
       // var process2 = Process.Start("notepad.exe");
        Thread.Sleep(1000 * 60 * 1 * minutesProcess2);
        //process.WaitForExit(1000);
        process2.Kill();
    }
}
 

Комментарии:

1. Проще всего было бы добавить an else и a Thread.Sleep() , чтобы он не опрашивал непрерывно, перегружая процессор, но на самом деле вы должны использовать какую-то другую форму запланированной задачи для запуска этого не занятого цикла. Взгляните на Windows Task Scheduler или Quartz.net .

2. Почему бы просто не использовать планировщик задач Windows? Несмотря на то, что объектная модель основана на COM, она проста в использовании из управляемых приложений. Просто добавьте COM-ссылку

3. Существуют классы таймеров с явной целью выполнять регулярные действия.

4. Зачем изобретать велосипед? Существуют: планировщик задач Windows , HangFire , QuartzNET , таймеры

5. На самом деле, я не знал эту библиотеку.