Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSMQ从.NET接收超时_.net_Msmq_Message Queue - Fatal编程技术网

MSMQ从.NET接收超时

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

我希望能够读取和处理来自MSMQ的消息。队列是事务性的。我目前正在使用以下代码:

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添加额外对象以收集其他内容非常昂贵。公平分数。不过,队列为空并不是例外,而是超时。