Я не думаю, что какие-либо сообщения должны быть пропущены из-за быстрого обзора, но вы работаете очень странным образом с большим количеством возможностей для условий гонки.
Почему бы просто не получить сообщение и не передать его ProcessMessage
(если ProcessMessage
не удастся, вы все равно выполняете чтение). Если вам нужно обработать несколько получателей, выполните прием в транзакции MSMQ, чтобы сообщение было недоступно для других получателей, но не удалялось из очереди, пока транзакция не будет зафиксирована.
Кроме того, вместо опроса очереди, почему бы не сделать асинхронный прием и позволить пулу потоков обрабатывать завершение (где вы должны вызвать EndReceive
). Это избавляет от необходимости связывать поток, и вам не нужно отключать службу в особом случае (закройте очередь сообщений и затем вызовите MessageQueue.ClearConnectionCache();
).
Кроме того, прерывание потока - это действительно плохой способ выхода, просто вернитесь из функции запуска потока.