Не видя вызывающего кода, это отчасти предположение, но может показаться, что вы вызываете GetMessage () в довольно узком цикле. GetMessage - это синхронный вызов, в результате чего этот конкретный поток сам блокируется, ожидая ответа из очереди (другие потоки продолжают работать). В профилировщике это будет выглядеть очень плохо, потому что остальная часть логики цикла выполняется так быстро (т. Е. Вы тратите на выполнение кода одну или две мс, а получение сообщения в течение 50 мс будет выглядеть именно так).
Еще одно замечание: вам нужно быть очень осторожным, запрашивая очередь в тесных циклах по нескольким причинам:
1) Хотя плата за Tx мала, но не равна 0. Я обычно предлагаю некоторую логику отключения - то есть, если очередь пуста, подождите 100 мс, прежде чем проверять снова. Пустой дважды, обратно до 500 мс и т. Д. Очевидно, что вы должны сбалансировать это с пользовательским опытом, к которому вы стремитесь.
2) Если вы в конечном итоге масштабируете приложение - вы эффективно создаете DoS-атаку на очереди. 100 экземпляров, стучащих в очередь в тесной петле, могут действительно повредить перфекту.
Pat