Приложение С# Console - продолжайте работать

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

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

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

Я буду компилировать приложение в exe и затем запускать его как службу с помощью AlwaysUp.

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

Петр

Ответ 1

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

Ответ 2

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

Ответ 3

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

private ManualResetEvent Wait = new ManualResetEvent(false);

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

Wait.WaitOne();

Если вы хотите остановить и позволить ему выйти, вы можете сделать следующее:

Wait.Set();

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

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

Ответ 9

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

  • Держите своих пользователей от случайного закрытия приложения.
  • Храните приложение в загромождении экрана своих пользователей.

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

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

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

Ответ 10

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

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

Ответ 11

Создать задачу, а затем подождите.

class Program
{
    static void Main(string[] args)
    {
        var processTask = Process();
        processTask.Wait();
    }

    private static async Task Process()
    {
        var isNotCancelled = true;

        while (isNotCancelled)
        {
            //Polling time here
            await Task.Delay(1000);

            //TODO: Do work here and listen for cancel
            Console.WriteLine("I did  some work...");
        }
    }
}