Я написал довольно простое консольное приложение, чтобы проверять почтовый ящик Exchange каждые 30 секунд. Когда он не выполняет процедуру проверки, он находится в пустом цикле do / в методе Main просто для того, чтобы программа продолжала работать. Я обнаружил, что это занимает намного больше ресурсов сервера (около 50%), чем я ожидал.
Вот основной метод:
Sub Main()
GetSettings()
tmrCheckInterval.Interval = 30000
tmrCheckInterval.Start()
WriteToConsole("Scan app started")
Do
Loop
End Sub
У меня не так много консольных приложений, поэтому я не уверен, что это наиболее эффективный способ, и выбрал поиск в Google. Есть ли альтернативный процесс, который будет поддерживать работу приложения без потребления ресурсов?
Спасибо...
Если вы хотите, чтобы это запускалось только каждые 30 минут, вам много лучше полностью удалить цикл и вместо этого настройка запланированной задачи.
Но что касается того, почему этот код использует так много ЦП ... программа выполняет свою работу. У него замкнутый цикл, который никогда не останавливается и никогда не уступает ЦП. Он составляет около 50%, потому что у вас двухъядерный процессор, и он использует все одно ядро. Если бы у вас был четырехъядерный процессор, он бы использовал 25%. В старые плохие одноядерные времена это использовало бы все ЦП, и даже вызвать диспетчер задач, чтобы убить приложение, могло быть сложно. Сегодня мне будут сниться кошмары, вспоминая те времена, так что спасибо за это.
Я знаю, что кажется, что вы установили интервал в этом коде, но этот интервал применяется только к таймеру и не является частью тела цикла. Вам нужно что-то вроде этого:
Sub Main()
GetSettings()
WriteToConsole("Scan app started")
Do
'Remove the timer and call it's elapsed code directly here.
Thread.Sleep(30 * 60 * 1000)
Loop
End Sub
И опять же, это все еще не так хорошо, как просто использовать запланированное задание.
Идеально! Спасибо! Я предпочитаю метод [thread.sleep], потому что консоль отображает информацию обратной связи во время работы.
@BillNorman Намного лучше записывать эти данные в журнал. Это может быть файл, база данных, журнал событий Windows или служба системного журнала Linux, но вы не хотите, чтобы это работало постоянно. Это буду возвращается, чтобы укусить вас.
Вы можете уточнить?
да. Одна из областей, которую это вызовет укус, заключается в том, что .Net использует сборщик мусора, активируемый поколениями, который не подходит для длительно работающих программ. Это делает написание сервисного программного обеспечения для .Net особой дисциплиной, требующей тщательного понимания всего использования памяти. В противном случае со временем эта программа может израсходовать много «мертвой» памяти вашей системы или получить несжатое адресное пространство, что в конечном итоге приведет к сбою программы.
Кроме того, метод сна здесь - всего лишь костыль. У вас все еще есть жесткий цикл, который сжигает чрезмерное дополнительное время процессора (и аккумулятор для ноутбуков), которое просто не нужно. Он может не отображаться в диспетчере задач, но это все еще поток, который просыпается, запрашивает время и заставляет переключать контекст в сторону от других задач. И это неточно. Здесь не учитывается время, необходимое для фактической проверки Exchange, поэтому время здесь имеет тенденцию к смещению. Запланированная задача исправляет это.
И еще кое-что. Вот что приходит мне в голову.
Что касается использования журнала, это лучшая практика ... Журналы позволяют вам отслеживать результаты, даже если вы не находитесь за компьютером. Они позволяют вам проверять историю или использоваться для отправки предупреждений. Они позволяют сопоставить проблемы при нескольких запусках приложения. Как правило, они более эффективны. Они могут позволить вам администрировать подобное приложение для нескольких пользователей.
Хороший совет, спасибо. Еще один вопрос ... что, если бы я сделал его приложением Windows Form? Это кажется излишним для такого простого процесса, но поможет ли это избежать ошибок, о которых вы упомянули для консольного приложения?
Нет, не пойдет. Такая же проблема существует. Что вы можете сделать, так это создать приложение Windows Forms, которое в основном живет как значок на панели задач ... но вы еще должны быть очень осторожны с использованием памяти.
Как насчет того, чтобы запускать приложение из Планировщика заданий каждые n минут и запускать его один раз от начала до конца, без цикла?