Консоль vb.net в цикле do

Я написал довольно простое консольное приложение, чтобы проверять почтовый ящик Exchange каждые 30 секунд. Когда он не выполняет процедуру проверки, он находится в пустом цикле do / в методе Main просто для того, чтобы программа продолжала работать. Я обнаружил, что это занимает намного больше ресурсов сервера (около 50%), чем я ожидал.

Вот основной метод:

 Sub Main()
    GetSettings()
    tmrCheckInterval.Interval = 30000
    tmrCheckInterval.Start()
    WriteToConsole("Scan app started")
    Do
    Loop

End Sub

У меня не так много консольных приложений, поэтому я не уверен, что это наиболее эффективный способ, и выбрал поиск в Google. Есть ли альтернативный процесс, который будет поддерживать работу приложения без потребления ресурсов?

Спасибо...

Как насчет того, чтобы запускать приложение из Планировщика заданий каждые n минут и запускать его один раз от начала до конца, без цикла?

Andrew Mortimer 12.09.2018 16:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Bill Norman 12.09.2018 16:57

@BillNorman Намного лучше записывать эти данные в журнал. Это может быть файл, база данных, журнал событий Windows или служба системного журнала Linux, но вы не хотите, чтобы это работало постоянно. Это буду возвращается, чтобы укусить вас.

Joel Coehoorn 12.09.2018 17:01

Вы можете уточнить?

Bill Norman 13.09.2018 14:23

да. Одна из областей, которую это вызовет укус, заключается в том, что .Net использует сборщик мусора, активируемый поколениями, который не подходит для длительно работающих программ. Это делает написание сервисного программного обеспечения для .Net особой дисциплиной, требующей тщательного понимания всего использования памяти. В противном случае со временем эта программа может израсходовать много «мертвой» памяти вашей системы или получить несжатое адресное пространство, что в конечном итоге приведет к сбою программы.

Joel Coehoorn 13.09.2018 16:11

Кроме того, метод сна здесь - всего лишь костыль. У вас все еще есть жесткий цикл, который сжигает чрезмерное дополнительное время процессора (и аккумулятор для ноутбуков), которое просто не нужно. Он может не отображаться в диспетчере задач, но это все еще поток, который просыпается, запрашивает время и заставляет переключать контекст в сторону от других задач. И это неточно. Здесь не учитывается время, необходимое для фактической проверки Exchange, поэтому время здесь имеет тенденцию к смещению. Запланированная задача исправляет это.

Joel Coehoorn 13.09.2018 16:13

И еще кое-что. Вот что приходит мне в голову.

Joel Coehoorn 13.09.2018 16:19

Что касается использования журнала, это лучшая практика ... Журналы позволяют вам отслеживать результаты, даже если вы не находитесь за компьютером. Они позволяют вам проверять историю или использоваться для отправки предупреждений. Они позволяют сопоставить проблемы при нескольких запусках приложения. Как правило, они более эффективны. Они могут позволить вам администрировать подобное приложение для нескольких пользователей.

Joel Coehoorn 13.09.2018 16:20

Хороший совет, спасибо. Еще один вопрос ... что, если бы я сделал его приложением Windows Form? Это кажется излишним для такого простого процесса, но поможет ли это избежать ошибок, о которых вы упомянули для консольного приложения?

Bill Norman 13.09.2018 16:24

Нет, не пойдет. Такая же проблема существует. Что вы можете сделать, так это создать приложение Windows Forms, которое в основном живет как значок на панели задач ... но вы еще должны быть очень осторожны с использованием памяти.

Joel Coehoorn 13.09.2018 16:38

Другие вопросы по теме