【发布时间】:2011-07-17 15:26:20
【问题描述】:
我在 c# 中有一个控制台应用程序,我正在尝试从消息队列接收消息,直到消息队列为空。比如,
MessageQueue queue = new MessageQueue();
While(queue.notempty)
{
queue.receive(...)
}
我该怎么做?
谢谢。
【问题讨论】:
-
你是指MSMQ还是其他类型的消息队列?
我在 c# 中有一个控制台应用程序,我正在尝试从消息队列接收消息,直到消息队列为空。比如,
MessageQueue queue = new MessageQueue();
While(queue.notempty)
{
queue.receive(...)
}
我该怎么做?
谢谢。
【问题讨论】:
如果您在 C# 中执行此操作,Queue<T> 类应该可以工作:
Queue<Message> queue = GetMessageQueue();
while(queue.Count > 0)
{
Message message = queue.Dequeue();
// process message
}
如果您计划从多个线程填充队列,您可以考虑改用ConcurrentQueue<T>(或BlockingCollection<T>)。
如果您正在为 MSMQ 使用 MessageQueue 类,您可以随时使用:
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);
}
【讨论】:
没有办法检查队列是否为空。您必须以这种方式接收它:
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
}
【讨论】:
public class PersonDetails
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateTime { get; set; }
}
const string queueName = @".\private$\PersonQueue";
public void GetMessageFromQueue(string queueName)
{
MessageQueue perosnMessageQueue = new MessageQueue(queueName);
try
{
XmlMessageFormatter xmlMessageFormatter = new XmlMessageFormatter(new Type[] {
(typeof(PersonDetails)) });
perosnMessageQueue.Formatter = xmlMessageFormatter;
perosnMessageQueue.Refresh();
for (int i = perosnMessageQueue.GetAllMessages().Count(); i !=0; i--)
{
var personDetailsFromQueue =
(PersonDetails)perosnMessageQueue.Receive
(MessageQueueTransactionType.Automatic).Body;
Console.WriteLine("FistName : {0} \n LastName : {1} \n Date Time :
{2}",personDetailsFromQueue.FirstName,
personDetailsFromQueue.LastName,
personDetailsFromQueue.DateTime);`
}
【讨论】: