Порядок вызова методов в службе Windows

В каком порядке вызов метода происходит в службе Windows? У нас проблема с синхронизацией, и я думаю, что это связано с тем, что конструктор слишком долго завершает обработку.

Это аналогичная проблема, которая, как мне кажется, Ошибка 1053 служба не ответила на запрос запуска или контроля

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

Кроме того, будет ли метод OnStart лучшим местом для размещения всей обработки?

** Решение

Сделал некоторое время, чтобы сделать тестовую службу и протестировал ответы ниже, и выяснил, что тайм-аут исходит из обработки основного метода, а также конструктор, вызываемый в методе Main, заставляя его отключиться. Перемещение всего на OnStart, а также просто отключение потока, похоже, сработало. Подробности здесь. http://www.adamthings.com/post/2012/06/28/error-1053-the-service-did-not-respond-to-the-start-or-control-request-in-a-timely-fashion/

Ответ 1

Не блокируйте метод OnStart(). Похоже, вы это делаете.

Создайте отдельный поток в методе OnStart() и выйдите оттуда.

Я не тестировал это, но что-то похожее на:

protected override void OnStart(string[] args)
{
    var worker = new Thread(DoWork);
    worker.IsBackground = false;
    worker.Start();

    base.OnStart(args);
}

private void DoWork()
{
    while (!_stopRequested)  // (set this flag in the OnStop() method)
    {
        // processing goes here
    }
}

Чтобы ответить на ваш вопрос о порядке событий, просто настройте инструкции Trace в каждом методе. Я не уверен, насколько это полезно. Сообщение (услуга не ответила на запрос начала...), который вы получаете, указывает на блокировку (или слишком длительную) в методе, который должен выполняться относительно быстро.

Ответ 2

Я считаю, что порядок

Что касается того, где разместить свой код, я бы предложил поместить любой код, который можно кэшировать в Main, и любой код, который перерабатывается при каждом запуске внутри OnStart. Однако вы не должны выполнять какую-либо фактическую обработку в OnStart, просто инициализацию. Используйте отдельный поток, чтобы выполнить основную часть вашей логики.

Кроме того, MSDN полезен с этим