Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как сделать консольное приложение, которое бесконечно работает в фоне и реагирует на события?

#c_sharp #net


Только зацикливанием main можно решить данную задачу или есть более красивое решение?
    


Ответы

Ответ 1



Суть приложения — это выполнение функции Main, пока это приложение должно работать. Соответственно, если приложение должно работать вечно, то не выходить из метода Main — это единственное верное и абсолютно естественное решение. Пусть вас не обманывают разные платформы вроде Windows.Forms — в конечном счёте ваш код уходит корнем в метод Main в .NET, который уходит корнем во входной адрес в заголовке исполняемого файла. Когда функция завершает выполнение, ось считает процесс выполнившимся. С точки зрения реализации, конечно, не надо делать while (true) Thread.Sleep(1), вместо это следует по-нормальному дожидаться событий, на которые приложение должно реагировать. Например, если приложение должно реагировать на ввод в консоль, то в цикле можно сделать чтение Console.ReadLine() — эта функция остановит выполнение без пожирания процессорного времени и вернёт строку тогда, когда она есть. Правда в винде "вечно работающие приложения" обычно делают службами. Служба регистрируется в системном списке служб, получает средства для управления выполнения пользователем, ось следит за запуском и работой службы и т. п. Консоль удобна разве что для отладки, потому что можно выводить журнал сразу в консоль для наглядности. Если приложение должно тесно взаимодействовать с пользователем, ещё можно сделать иконку в области уведомлений.

Ответ 2



Консольное приложение не может работать в ФОНЕ. Консоль - это stdin, stdout и stderr. ЛЮБОЕ приложение работающее в фоне обязано отключить эти стандартные файлы. Такое приложение, в linux терминологии, называется "демоном". На виндовозном языке - "сервис". Существуют строгие правила написания демонов. Например, как они должны отключаться от консоли. Эти правила изложены во многих местах. Например здесь: http://citforum.ru/programming/unix/daemons/ Любой демон находится в состоянии ожидания, до тех пор, пока не происходит некоторое событие. Ну, например: Демон получил сигнал SIGHUP Демон получил извещение от inotify Пришло сообщение из канала или очереди сообщений ...

Ответ 3



Во-первых работающее в фоне приложение конечно должно быть сервисом (Windows Service). Но полезно реализовать двоякий режим -- чтобы можно было также запустить с командной строки -- нужно для проверок и отладки. Во-вторых, нужен шедулер (scheduler) -- часть программы которая отвечает за вызов задач (tasks, jobs) по расписанию или по внешним событиям. Шедулер лучше взять готовый (например, Quartz.net) -- чтобы не наступать снова на все те же самые грабли.

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

Отправить комментарий