2012-06-28 1 views
10

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

Это аналогичный вопрос, который я думаю, что мы имеем Error 1053 the service did not respond to the start or control request

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

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

** Решение

Сделаны некоторое время, чтобы сделать тест службу и протестировал ответы ниже и выяснил, тайм-аут, исходит из основной обработки метода, а также конструктор вызывается в главном методе вызывая его к тайм-ауту. Перемещение всего на 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/

+0

OnStart должен запустить другой поток, который обрабатывает всю вашу обработку, поэтому метод может немедленно вернуться. По моему опыту это работает лучше всего. Я бы ничего не поставил в InitializeComponent. – Mangist

+0

OnStop должен прервать поток и ждать его завершения :) – Mangist

+1

Вы можете узнать, разместив контрольные точки. – usr

ответ

6

Не блокируйте в методе 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 
    } 
} 

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

+0

Это была отличная помощь в движении моих мыслей. Спасибо за ответ. Написал мои выводы в комментариях к оригинальному сообщению. – Adam

6

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

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

Кроме того, MSDN is helpful with this

+0

Спасибо за ответ , это было полезно. Написал мои выводы в комментариях к оригинальному сообщению. – Adam

Смежные вопросы