Служба Windows C # - PullRequest
       17

Служба Windows C #

0 голосов
/ 13 апреля 2010

Сценарий

Я создал службу Windows, но всякий раз, когда я запускаю ее, она немедленно останавливается. Служба получена из консольного приложения, которое подписывалось на событие и отслеживало процессы на сервере. Если что-то случится с процессом (то есть оно было убито), то событие вызовет перезапуск процесса. Причина, по которой я вам это говорю, заключается в том, что оригинальный код выглядел так:

Оригинальный код консольного приложения:

    static void Main(string[] args)
    {
        StartProcess sp = new StartProcess();
        //Note the readline that means the application sits here waiting for an event!
        Console.ReadLine(); 
    }

Теперь, когда этот код превратился в Службу Windows, он по сути ТОТ ТО ЖЕ. Однако служба не ждет, даже с readline, она просто заканчивается .....

Новый код обслуживания Windows:

    protected override void OnStart(string[] args)
    {
        ProcessMonitor pm = new ProcessMonitor();
        Console.ReadLine();
    }

Мысли

Поскольку функциональность полностью заключена в этом единственном классе (он буквально запускается, настраивает некоторые события и ожидает) - Как я могу заставить службу фактически сидеть там и просто ждать? Кажется, игнорирует readline. Однако это прекрасно работает как консольное приложение, гораздо удобнее иметь его в качестве службы.

Ответы [ 5 ]

5 голосов
/ 13 апреля 2010

Как правило, вы хотели бы что-то вроде этого. Как Джо упомянул в комментариях, вы хотите Start инициализировать и передать управление другому потоку, чтобы убедиться, что вы вернетесь в течение 30 секунд.

private readonly ProcessMonitor processMonitor = new ProcessMonitor();

protected override void OnStart(string[] args)
{
    processMonitor.Start();
}

protected override void OnStop()
{
    processMonitor.Stop();
}
4 голосов
/ 13 апреля 2010

В Сервисе нет понятия readline - нет клавиатуры. Я не удивлюсь, если это вызовет исключение при этом вызове. Вы проверили журнал приложений?

2 голосов
/ 13 апреля 2010

Ну ... Служба не имеет консольного ввода / вывода.Таким образом, ReadLine не остановит его выполнение.

Что делает ProcessMonitor?

Обычно для служб ваш код находится в потоке, который отслеживает, была ли служба остановлена ​​или приостановлена.

0 голосов
/ 14 февраля 2019

Переместите консоль.ReadLine (); в свой конструктор ProcessMonitor () и создайте свой ProcessMonitor внутри конструктора для службы. Ваш метод OnStart может быть пустым. Несмотря на то, что люди говорят, что консольные методы НЕ сломают ваш сервис, однако это, вероятно, не лучшая практика. Я предполагаю, что правильный способ сохранить службу (после запуска ваших таймеров) - использовать цикл while с Thread.Sleep (60000) внутри него.

Когда я пишу службу, я помещаю все функциональные возможности в проект библиотеки классов, затем создаю проект консольного приложения для проверки функциональности службы, а затем проект службы Windows. И консольное приложение, и проект службы Windows вызывают один метод в библиотеке классов, чтобы запустить функцию службы. Если вы используете эту технику, вы можете вызвать Console.WriteLine в библиотеке классов, которую можно просмотреть при запуске консольного приложения. PS Topshelf переоценен, написание службы Windows не так сложно.

public partial class ProcessMonitor_Service : ServiceBase
{

    public ProcessMonitor_Service()
    {
        InitializeComponent();            
        ProcessMonitor pm = new ProcessMonitor();
    }

    protected override void OnStart(string[] args)
    {

    }

    protected override void OnStop()
    {

    }
}

public class ProcessMonitor
{
    public ProcessMonitor()
    {
        // start timers
        Console.ReadLine(); 
    }
}
0 голосов
/ 13 апреля 2010

OnStart () должен завершиться и успешно завершиться, чтобы служба считалась запущенной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...