Насколько я вижу из документации, вы должны проверять, есть ли сообщения в очереди сообщений, используя метод Peek. Затем вы полагаетесь на его сбой с MessageQueueException, чтобы сообщить вам, что очередь пуста.
public bool IsQueueEmpty()
{
bool isQueueEmpty = false;
MessageQueue myQueue = new MessageQueue(".\\myQueue");
try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}
catch(MessageQueueException e)
{
if (e.MessageQueueErrorCode ==
MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}
Мне всегда говорили — и я испытал на себе, — что исключения обходятся дорого и не должны использоваться для обычных операций. Итак, мои вопросы:
Верны ли мои предположения о том, что перехват MessageQueueException является дорогостоящей операцией?
Есть ли способ синхронно проверить наличие сообщений в очереди, не полагаясь на исключения?
Я работаю с пространством имен System.Messaging на С#, но если мне нужно будет выйти из-под контроля, чтобы решить эту проблему, это может быть вариантом. И обратите внимание, что я хочу решение без использования WCF с MSMQ.