Проблемы с запуском, остановкой, отладкой службы Windows - PullRequest
1 голос
/ 25 сентября 2011

У меня есть служба, о которой я не знаю времени выполнения, я думаю, около 7 секунд.По какой-то причине сервис перестает работать после первого запуска, и я не могу его отладить.В диспетчере сервисов все время говорится «запуск», и я не могу найти его в окне процесса присоединения.

Когда я пытаюсь остановить его, кнопка остановки появляется только на секунду.Даже если я нажимаю на нее, я получаю сообщение об ошибке «Windows не может остановить службу». Splive на локальном компьютере. Служба не возвращает ошибку. Это может быть внутренняя ошибка Windows или внутренняя ошибка службы. "

Как лучше всего решить эту проблему?

static void Main(string[] args)
    {
        ServiceBase.Run(new Program());
        ServiceController service = new ServiceController();
        service.ServiceName = "SpLive";
        service.Start();
        //Sp objSportingbet = new Sp();
        //objSportingbet.getListingsFromSp();
    }
    public Program()
    {
        this.ServiceName = "SpLive";
    }
    protected override void OnStart(string[] args)
    {
        base.OnStart(args);
        objSportingbet.getListingsFromSp();
        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
        timer1.Interval = 7000;
        timer1.Enabled = true;
        timer1.Start();
    }
    protected override void OnStop()
    {
        base.OnStop();
        timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
        timer1.Interval = 7000;
        timer1.Enabled = false;
        timer1.Start();
    }
    private void timer1_Elapsed(object sender, EventArgs e)
    {
        ServiceController service = new ServiceController();
        service.ServiceName = "Sp";
        if (service.Status == ServiceControllerStatus.Stopped)
        {
            service.Start();
        }
        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
        }
        timer1.Stop();
    }

    private void InitializeComponent()
    {
        // 
        // Program
        // 
        this.CanPauseAndContinue = true;
        this.CanShutdown = true;

    }

Ответы [ 3 ]

3 голосов
/ 13 апреля 2012

В идеале вы хотели бы отладить метод OnStart вашего сервиса, чтобы увидеть, что происходит. И это возможно:

protected override void OnStart(string[] args)
{
    #if DEBUG
    Debugger.Launch();
    #endif
    ...
}

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

3 голосов
/ 25 сентября 2011

Настройка службы для запуска в отладчике: http://support.microsoft.com/kb/824344 Обратите внимание на раздел «Настройка службы для запуска с подключенным отладчиком WinDbg»

Дополнение (теперь есть соответствующий код):

static void Main(string[] args)
{
   ServiceBase.Run(new Program());
   ServiceController service = new ServiceController();
   service.ServiceName = "SpLive";
   service.Start();

ServiceBase.Run(instance) не вернется до тех пор, пока служба не будет закрыта, поэтому вы запускаете службу, а затем после ее завершения запрашиваете SCM запустить службу & hellip; это приведет только к путанице.

Это, плюс наличие таймера для попытки изменить состояние службы (запущено <-> остановлено), заставляет меня думать, что вам нужно подумать о базовой модели процессов службы Windows:

Когда exe выполняет только один сервис:

  1. Служба запущена (при запуске системы, по запросу пользователя, ...): SCM запускает зарегистрированную командную строку

  2. Main работает, сообщите SCM (через ServiceBase.Run), что это за услуга. Это должно соответствовать регистрации, использованной на шаге 1.

  3. Экземпляр, переданный в ServiceBase.Run, вызывает OnStart. Служба должна запустить действия, которые она выполнит, а затем вернуть ее (т. Е. Асинхронные операции, новые потоки и пул потоков в порядке; продолжение потока, вызывающего OnStart, - нет).

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

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

0 голосов
/ 02 декабря 2014

Обработчики OnStart и OnStop имеют фиксированный лимит времени для обработки.Я не знаю, как работает остановка (ожидает ли он выполнения потока ...), но для OnStart в вашем случае (я знаю, что это старый поток ...), я бы переместил весь код приложения втаймер обратного вызова и установите таймер в функции OnStart.Я установил мой около 1 минуты.OnStart немедленно выйдет, что удовлетворяет требованиям менеджеров сервиса.Но теперь у вас есть поток, который запускается примерно через минуту, что позволяет вам присоединить ваш процесс к отладчику.Очевидно, установите точку останова для первой инструкции в обратном вызове таймера OnStart.

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