Я хотел бы сказать несколько вещей здесь.
Прежде чем я получу свой собственный ответ, я хотел бы прокомментировать решение Джона Опнакара (в ответе ученика доктора Вилли). Его код работает на удаленных машинах. Я использовал его код в нашем проекте на работе, чтобы наблюдать за очередями на удаленном кластерном сервере, и он работает очень хорошо .
Итак, если вы получаете ошибки «RemoteMachineNotAvailable», пожалуйста, проверьте ваши настройки. Все ли машины находятся в одной сети или - не стоит забывать - настроены ли права доступа в очереди на удаленной машине, чтобы другие могли их читать?
Имеют ли пользователи / учетные записи достаточные права для чтения из других систем?
Например, мы должны были разрешить всем в кластеризованных очередях.
Насколько я знаю, у PerformanceCounters действительно есть проблемы с чтением свойств сообщений на удаленных машинах. Я пытался использовать их для очередей в кластерной среде Windows Server, но так и не смог заставить его работать. В то время я проводил некоторые интернет-исследования, но, к сожалению, я не помню, связано ли это с соображениями безопасности или просто с ошибкой. : - (
Теперь к фактическому ответу. Если вам не нравится метод Cursor-Method, описанный Джоном Опинкаром, вы также можете использовать методы MessageQueue.GetAllMessages () или MessageQueue.GetMessageEnumerator .
Я никогда не пробовал GetMessageEnumerator, но могу сказать, что я бы не рекомендовал GetAllMessages ().
Мы страдали от серьезных проблем с производительностью при использовании каждую секунду в системе с несколькими очередями, которые содержат несколько тысяч сообщений.
Метод делает снимок всех сообщений в очереди, что может вызвать большие нагрузки в памяти и сети.
Метод курсора все еще несколько медленный. Но, по крайней мере, в нашей производственной среде он выглядит более быстрым, чем с решением GetAllMessages ().
Если подсчет сообщений в вашем сценарии необязательно должен составлять одну секунду и у вас меньше сообщений для подсчета, чем у нас, тогда работа с GetAllMessages () или GetMessageEnumerator () может оказаться для вас возможным решением.
Наконец, это всегда сводится к вашим собственным индивидуальным потребностям.