Код NetMq (ZeroMq) не работает как служба Windows

1

Сервис устанавливается правильно.

Но как только я вызываю этот 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();
                }
            }
        }
    }
Теги:
zeromq

1 ответ

2
Лучший ответ

OnStart не следует напрямую обращаться к LogsConsumer. Он должен запустить новый поток, который запускает цикл LogsConsumer.

Менеджер управления службами Windows не изменит статус с "Пуск" на "Начать" до тех пор, пока не выйдет метод OnStart. То, как вы его кодировали, OnStart никогда не выходит из такого поведения, которое вы видите, именно то, что я ожидаю.

BTW - после устранения этой проблемы вы можете столкнуться с аналогичной проблемой при попытке остановить службу. Вам нужно будет изменить цикл, чтобы каким-то образом запросить его выход, а затем переопределить OnStop, чтобы сигнализировать о выходе потока. Чистый способ ZeroMQ справиться с этим состоит в том, чтобы иметь опрос по потоку двух сокетов - существующего внешнего связанного сокета и второго сокета inproc (см. Http://zguide.zeromq.org/page:all#Handling-Multiple-Sockets).

Цель второго сокета - разрешить методу OnStop (который запущен в отдельном потоке службы), чтобы отправить сообщение в рабочий поток, чтобы остановить его.

  • 0
    Благодарю. Я также изучал это и вчера нашел то же самое решение. Я назвал ZeroMq Thing в отдельной фоновой ветке, и она работает мирно. Но я ничего не сделал в отношении OnStop ().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню