#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
и aThread.Sleep()
, чтобы он не опрашивал непрерывно, перегружая процессор, но на самом деле вы должны использовать какую-то другую форму запланированной задачи для запуска этого не занятого цикла. Взгляните наWindows Task Scheduler
илиQuartz.net
.2. Почему бы просто не использовать планировщик задач Windows? Несмотря на то, что объектная модель основана на COM, она проста в использовании из управляемых приложений. Просто добавьте COM-ссылку
3. Существуют классы таймеров с явной целью выполнять регулярные действия.
4. Зачем изобретать велосипед? Существуют: планировщик задач Windows , HangFire , QuartzNET , таймеры …
5. На самом деле, я не знал эту библиотеку.