2011-03-17 97 views
4

我在c#中有一个控制台应用程序,我试图从消息队列接收消息,直到消息队列为空。所以类似的,消息队列循环

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

我该怎么做?

谢谢。

+1

你的意思是MSMQ或其他类型的消息队列? – BrokenGlass 2011-03-17 18:31:31

回答

5

有没有办法来检查队列是否为空。你必须接受这样说:

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

如果你在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); 
} 
+0

他是关于不同的主题:MSMQ – Andrey 2011-03-17 18:37:34

+0

@Andrey:为了以防万一(不清楚),我已更新,以包括它:) – 2011-03-17 18:47:52