如何MessageQueue.BeginReceive工作以及如何正确使用它呢?

我现在有一个后台线程。 在这个线程是一个无限循环。

这在循环更新一次数据库中的一些值,然后侦听上的MessageQueue 1秒(与queue.Receive(TimeSpan.FromSeconds(1))

只要没有消息进来,这一呼吁在内部抛出它被捕获,然后继续循环一个MessageQueueException(超时)。 如果有一个消息调用正常返回,并处理该消息,继续循环之后。

这导致很多第一次机会异常(每秒,除了有处理邮件),这修建垃圾调试输出,还当我忘了排除MessageQueueExceptions调试器打破。

因此,意指的MessageQueue的异步处理如何正确完成,同时还保证,只要我的应用程序运行时,队列进行监控和数据库在一段时间也更新一次。 当然,这里线程不应该占用100%的CPU。

我只需要大画面或暗示一些做正确处理异步。

--------------解决方案-------------

你有没有考虑这是从MessageQueue.GetMessageEnumerator2返回MessageEnumerator?

  • 你得到的队列的动态内容审查和迭代过程中从队列中删除的消息。
  • 如果没有消息,则MoveNext()将返回FALSE,你并不需要赶上第一次机会异常
  • 如果有新邮件后,你开始迭代那么他们将被迭代(如果它们光标穿上后)。
  • 如果光标之前有新邮件那么你可以重置一个迭代或继续(如果你不此刻需要较低优先级的消息)。

而不是在一个线程循环,我会建议注册一个委托你的MessageQueue的ReceiveCompleted事件,如下所述:

http://msdn.microsoft.com/en-us/library/hce32dze(VS.71).aspx

相反,由杰米·狄克逊的意见,该方案是例外。 注意该方法的命名和其参数:BeginReceive(时间跨度超时)

有方法被命名BeginTryReceive,它会一直如果没有接到消息完全正常的。 命名它BeginReceive(或接收,对于同步的版本)意味着一个消息有望进入队列。 该时间跨度参数被命名为超时也显著,因为超时是例外。 超时表示响应预期,但没有给出,调用者选择不再等待,假设发生了错误。 当你调用BeginReceive /接收了1秒超时,就表示如果没有消息到那个时候进入队列,一定出了错误,我们需要处理它。

我会实现这一点的方式,如果我理解你想要正确地做什么,是这样的:

  • 调用BeginReceive要么具有非常大的超时,或者即使没有超时,如果我没有看到一个空队列为错误。
  • 事件处理函数附加到ReceiveCompleted事件,这1)处理消息,2)再次调用BeginReceive。
  • 我不会用一个无限循环。 这是使用异步方法,如BeginReceive当两个不好的做法,完全是多余的。
  • 编辑:要放弃这是不被任何客户端读取队列中,有队列作家不期而遇的队列,以确定它是否是'死'。

编辑:我还有一个建议。 因为我不知道你的应用程序的细节我不知道它是否是可行或适当。 在我看来,你基本上是建立客户端和服务器之间的连接,以消息队列作为通信​​通道。 为什么这是一个“连接”? 由于该队列将不会被写入,如果没有人听。 这几乎是一个连接是什么,我想。 那岂不是更合适使用套接字或命名管道传输的消息? 这样一来,客户只需关闭流对象,他们读完的时候,和服务器立即通知。 正如我所说,我不知道它是否能为你做什么工作,但感觉就像一个更合适的沟通渠道。

分类:C# 时间:2013-09-29 人气:0
本文关键词: MSMQ,异步,消息队列
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.500 (s). 9 q(s)