.NET Windows Service говорит, что не отвечает, хотя я знаю, что он работает - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть служба Windows .NET 2.0, которую я установил с помощью installutil.exe. Функцией службы является служба пакетной обработки, которая проходит через входной файл, обрабатывает каждую запись и сохраняет выходной файл. Когда я запускаю службу в Windows Service, через 20 секунд она говорит, что служба не отвечает, поэтому она останавливает службу, однако из выходного файла я вижу, что служба работает нормально. Точное сообщение, которое я получаю: Ошибка 1053: Служба не ответила на запрос запуска или управления своевременно.

Я увеличил время ожидания службы Windows с помощью взлома реестра, но он дает те же результаты (единственное отличие состоит в том, что для получения сообщения «не отвечает» требуется больше времени).

Метод OnStart моего сервиса выглядит следующим образом:

protected override void OnStart(string[] args)
{ 
     Producer producer = new Producer();
     ThreadStart st = new ThreadStart(producer.Produce); 
     workerThread = new Thread(st); 
     workerThread.Start();
}

static void Main()  
{
     System.ServiceProcess.ServiceBase[] ServicesToRun;
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new BatchService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
}

Производитель конструктора:

public Producer()
{
     nMaxConcurentJobs =   int.Parse(ConfigurationManager.AppSettings["MaxConcurentJobs"]); 
     if (ConfigurationManager.AppSettings[TIME_INTERVAL] != null)`  
     {
          sleepTime = int.Parse(ConfigurationManager.AppSettings[TIME_INTERVAL]);
          sleepTime *= 1000;
     } 
}

Есть ли что-то, что мне нужно, чтобы уведомить службу Windows, что она работает ?? Буду признателен за любую помощь, я борюсь с этим уже несколько дней!

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Удостоверьтесь, что OnStart вызывается, заставляя его сделать какой-то вывод журнала.

Убедитесь, что вы не выполняете большую работу в своем ServiceBase -обработанном конструкторе классов, OnStart - это место, где можно выполнять тяжелую работу.

Если логика запуска длительна, вам, вероятно, придется позвонить RequestAdditionalTime , чтобы предотвратить диспетчер управления службами (SCM), предположивший, что ваш процесс умер. Когда вы вернетесь с OnStart, SCM пометит ваш сервис как «Работающий» в графическом интерфейсе сервисов.

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

0 голосов
/ 28 апреля 2011

Я не вижу подробностей о Producer.Produce() нигде, но я замечаю то, что кажется членом, называемым sleepTime. Вы используете Thread.Sleep()? Если да, то пытались ли вы использовать вместо него Монитор или Таймер ?

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