Сервис устанавливается правильно.
Но как только я вызываю этот LogsConsumer()
, он создает проблему.
Он устанавливается, но не запускается. Он продолжает показывать статус "Запуск"
protected override void OnStart(string[] args)
{
LogsConsumer();
}
public static void LogsConsumer()
{
using (NetMQContext ctx = NetMQContext.Create())
{
using (var consumer = ctx.CreatePullSocket())
{
consumer.Bind("tcp://localhost:5005");
while (true)
{
string msg = consumer.ReceiveString();
}
}
}
}
OnStart не следует напрямую обращаться к LogsConsumer. Он должен запустить новый поток, который запускает цикл LogsConsumer.
Менеджер управления службами Windows не изменит статус с "Пуск" на "Начать" до тех пор, пока не выйдет метод OnStart. То, как вы его кодировали, OnStart никогда не выходит из такого поведения, которое вы видите, именно то, что я ожидаю.
BTW - после устранения этой проблемы вы можете столкнуться с аналогичной проблемой при попытке остановить службу. Вам нужно будет изменить цикл, чтобы каким-то образом запросить его выход, а затем переопределить OnStop, чтобы сигнализировать о выходе потока. Чистый способ ZeroMQ справиться с этим состоит в том, чтобы иметь опрос по потоку двух сокетов - существующего внешнего связанного сокета и второго сокета inproc (см. Http://zguide.zeromq.org/page:all#Handling-Multiple-Sockets).
Цель второго сокета - разрешить методу OnStop (который запущен в отдельном потоке службы), чтобы отправить сообщение в рабочий поток, чтобы остановить его.