【问题标题】:When should I call MessageQueue.EndReceive()?我应该何时调用 MessageQueue.EndReceive()?
【发布时间】:2011-05-12 05:28:15
【问题描述】:

我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,EndReceive() 方法在 ReceiveCompletedEventHandler 开始时立即被调用,然后它开始实际处理消息的任务。只是我,还是这完全忽略了 MSMQ 的可靠性? EndReceive() 不应该只在消息被完全处理后才被调用吗?

【问题讨论】:

    标签: .net windows windows-services msmq


    【解决方案1】:

    EndReceive 仅表示消息已成功传递 - 它并不意味着您是否能够用它做任何有价值的事情。

    听起来您正在考虑从 MSMQ 进行异步事务读取,其中您只会在完全处理您的消息时完成收据(一劳永逸地从队列中删除消息),无论这在您的上下文中可能意味着什么.但是异步事务读取是不可能的 - 请参阅MSDN documentation

    不要使用异步调用 从交易开始接收。如果你 想要执行事务 异步操作,调用 BeginPeek,并把交易和 (同步)接收方法 在您创建的事件处理程序中 用于 peek 操作。

    【讨论】:

    • 谢谢。那么,如果确认消息需要事务,那么如果你不调用 EndReceive() 会发生什么?
    • 我不确定我是否理解您的问题:确认交易不需要。要确认收到,您只需使用同步 Receive 方法 - 在异步场景中 - 您必须调用 EndReceive
    • 好的,这是我的问题:如果我未能调用 EndReceive,我是否会因此放弃确认,因此我不应该等到我成功处理消息后再调用它吗?跨度>
    • 我刚刚意识到我没有强调这里最重要的事情:你必须打电话给EndReceive(或Receive)才能得到你想要的Message。如果您希望消息在处理期间发生异常(或断电或类似情况)时返回队列,您应该执行transactional receive
    • 噢噢噢!我明白了... Message message = messageQueue.EndReceive(asyncResult.AsyncResult); ...您无法访问该消息而不调用它。谢谢,这清除了它。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多