Цикл сообщений - PullRequest
       11

Цикл сообщений

4 голосов
/ 17 марта 2011

У меня есть консольное приложение на c #, и я пытаюсь получить сообщение из очереди сообщений, пока очередь сообщений не станет пустой.Так что-то типа

MessageQueue queue = new MessageQueue();
While(queue.notempty)
{
    queue.receive(...)
}

Как я могу это сделать?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Нет способа проверить, пуста очередь или нет.Вы должны получить это так:

private Message Receive(MessageQueue queue)
{
   try 
   {
      return queue.Receive(TimeSpan.Zero);
   }
   catch (MessageQueueException mqe)
   {
      if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
         return null;
      throw;
   }
}

тогда вы можете сделать

MessageQueue queue = new MessageQueue();
Message msg;
while( (msg = Receive(queue)) != null)
{
    //process
}
0 голосов
/ 17 марта 2011

Если вы делаете это в C #, класс Queue<T> должен работать:

Queue<Message> queue = GetMessageQueue();

while(queue.Count > 0)
{
     Message message = queue.Dequeue();
     // process message
}

Если вы планируете заполнять очередь из нескольких потоков, вы можете использовать ConcurrentQueue<T> (или BlockingCollection<T>) вместо этого.


Если вы используете класс MessageQueue для MSMQ, вы всегда можете использовать:

MessageQueue queue = ...

TimeSpan timeout = TimeSpan.FromMilliseconds(100); // Small timeout - can be very small

Message message = queue.Receive(timeout);
while (message != null)
{
      // Process message...


      message = queue.Receive(timeout);
}
...