Консольное приложение C # - продолжайте работать - PullRequest
12 голосов
/ 30 марта 2009

Я собираюсь разработать консольное приложение, которое будет необходимо постоянно выполнять и выполнять работу в определенное время.

Мой вопрос: каковы лучшие методы или практики для поддержания вашего приложения в живых?

Мои мысли были: Цикл, который никогда не заканчивается? Таймер, который спит, а затем переходит к рутине, когда это необходимо (после установленного периода сна)?

Я буду компилировать приложение в исполняемый файл, а затем запускать его как службу, используя AlwaysUp.

С уважением ..

Peter

Ответы [ 11 ]

14 голосов
/ 30 марта 2009

Лучшим решением было бы написать консольное приложение, которое выполняет свою работу и завершает работу. Затем вы можете использовать планировщик заданий Windows для его периодического запуска.

8 голосов
/ 30 марта 2009

Почему бы вам сначала не создать свое приложение как сервис?

4 голосов
/ 05 декабря 2015

Хотя вы действительно должны использовать службу для этого, если вам все равно нужно / хотите сделать это, вы можете использовать ManualResetEvent для этого:

private ManualResetEvent Wait = new ManualResetEvent(false);

Когда вы закончите «запуск» и захотите просто подождать, вы должны сделать:

Wait.WaitOne();

Когда вы хотите остановиться и позволить ему выйти, вы можете сделать:

Wait.Set();
3 голосов
/ 05 марта 2013

Вы можете добавить ссылку на System.Windows.Forms и вызвать System.Windows.Forms.Application.Run(), чтобы начать стандартный цикл обработки сообщений приложения. Ctrl-C завершит работу приложения.

Другой вариант - использовать Console.ReadKey() для приостановки приложения. Нравится Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

Это то, что я использую в своих консольных приложениях, когда они просто сидят и ждут событий. В любом случае приложение будет продолжать работать и перехватывать инициированные события (например, из таймера, WCF, FileWatcher и т. Д.).

3 голосов
/ 30 марта 2009

Вы, вероятно, не хотите просто вращаться в цикле, без необходимости занимая процессорное время.

Если вы работаете в Windows, у вас должен быть цикл, который никогда не заканчивается вызовом WaitForSingleObject () или WaitForMultipleObjects () или MsgWaitForMultipleObjects () в зависимости от ваших потребностей. Затем возьмите какой-нибудь объект синхронизации, например, именованное событие.

См. Документацию по синхронизации Win32 здесь . Если вы подробнее расскажете о том, что должна делать ваша программа, мы, вероятно, можем дать более конкретный совет.

2 голосов
/ 30 марта 2009

Если ваша программа будет работать постоянно, то вам следует поспать, пока не произойдет желаемое событие (например, пройдет XX секунд). Если вы просто вращаете цикл {}, вы загружаете процессорное время.

Если ваша программа всегда будет работать на компьютере, вам следует подумать о том, чтобы сделать ее службой, чтобы она автоматически запускалась и останавливалась на машине.

2 голосов
/ 30 марта 2009

Код, который выполняется постоянно, называется демоном, и есть статья здесь с описанием того, как делать то, что вы просите. Это укажет вам пример того, как написать простой сервис здесь .

1 голос
/ 25 октября 2011

Отправка потока в сон: System.Threading.Thread.Sleep (10000);

Ожидание нажатия клавиши: Console.WriteLine («Нажмите любую клавишу, чтобы продолжить ...»); Console.Read ();

1 голос
/ 30 марта 2009

Если вы создаете настольное приложение, вам нужно, чтобы оно запускалось в системном трее. Это будет

  1. Не позволяйте пользователям случайно закрыть приложение
  2. Не допускайте, чтобы ваше приложение не загромождало экран ваших пользователей

Если вы создаете серверное приложение, вы захотите написать службу Windows. Это будет

  1. Не позволяйте администратору случайно закрыть ваше приложение
  2. Устранить необходимость того, чтобы сервер входил в консоль, чтобы приложение работало в

Как человек, который в первую очередь является ИТ-профессионалом, я бы сказал, что сторонние приложения, которые мы получаем, которые работают как консольные приложения вместо служб Windows, мы прилагаем много усилий, чтобы не быть купленными. Это создает для нас много работы и открывает значительные проблемы с поддержкой и пробелы в безопасности.

1 голос
/ 30 марта 2009

Ну, я уверен, что в какой-то момент это должно прекратиться, нет?

Создает поток, который работает, и имеет блок основного потока в Console.ReadLine (), если вы хотите, чтобы он также работал как консольное приложение.

Если вы действительно хотите навсегда приостановить основной поток, просто заблокируйте событие ManualResetEvent, которое вы никогда не запускаете.

Но рассмотрите возможность использования услуги, если можете.

...