MSMQ从.NET接收超时
我希望能够读取和处理来自MSMQ的消息。队列是事务性的。我目前正在使用以下代码:MSMQ从.NET接收超时,.net,msmq,message-queue,.net,Msmq,Message Queue,我希望能够读取和处理来自MSMQ的消息。队列是事务性的。我目前正在使用以下代码: while (true) { using (var txn = new MessageQueueTransaction()) { txn.Begin(); try { var message = queue.Receive(txn); Dispatch(message); tx
while (true)
{
using (var txn = new MessageQueueTransaction())
{
txn.Begin();
try
{
var message = queue.Receive(txn);
Dispatch(message);
txn.Commit();
}
catch (MessageQueueException ex)
{
txn.Abort();
}
}
}
其中,queue
是一个System.Messaging.MessageQueue
我想让循环在(!cancelled)时使用
,这意味着调用队列。接收接受超时的重载。但是,代码在达到超时时抛出,抛出这么多异常并不是一件好事。是否有类似于监视器的TryRecieve
?Peek似乎是最接近的,但它也会在达到超时时抛出
如果我希望从队列中获得高吞吐量读取和取消支持,那么从队列中读取的最佳方式是什么?请改用MessageQueue.BeginPeek()。为PeekCompleted事件编写的事件处理程序将在消息可用时立即运行。您可以调用Receive()并确保在没有超时的情况下收到消息。MSDN库文章中有一个很好的例子。不是直接的答案,但我会使用WCF中的net.msmq协议来处理messageQ。这是一个简洁的方法,可以满足您在这里提到的所有场景。“抛出这么多异常不是一件好事。”为什么不呢?你抓住他们了。这并不是说任何东西都会磨损:-)使用超时的一个优点是,在接收从未完成的情况下,您不会遇到错误。在超时情况下,接收将定期完成并再次调用。在非异常情况下不应抛出异常(队列为空并不例外)-抛出异常和向GC添加额外对象以收集其他内容非常昂贵。公平分数。不过,队列为空并不是例外,而是超时。