Порядок вызова методов в службе 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 полезен с этим