【发布时间】:2011-05-12 05:28:15
【问题描述】:
我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,EndReceive() 方法在 ReceiveCompletedEventHandler 开始时立即被调用,然后它开始实际处理消息的任务。只是我,还是这完全忽略了 MSMQ 的可靠性? EndReceive() 不应该只在消息被完全处理后才被调用吗?
【问题讨论】:
标签: .net windows windows-services msmq
我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,EndReceive() 方法在 ReceiveCompletedEventHandler 开始时立即被调用,然后它开始实际处理消息的任务。只是我,还是这完全忽略了 MSMQ 的可靠性? EndReceive() 不应该只在消息被完全处理后才被调用吗?
【问题讨论】:
标签: .net windows windows-services msmq
EndReceive 仅表示消息已成功传递 - 它并不意味着您是否能够用它做任何有价值的事情。
听起来您正在考虑从 MSMQ 进行异步事务读取,其中您只会在完全处理您的消息时完成收据(一劳永逸地从队列中删除消息),无论这在您的上下文中可能意味着什么.但是异步事务读取是不可能的 - 请参阅MSDN documentation:
不要使用异步调用 从交易开始接收。如果你 想要执行事务 异步操作,调用 BeginPeek,并把交易和 (同步)接收方法 在您创建的事件处理程序中 用于 peek 操作。
【讨论】:
Receive 方法或 - 在异步场景中 - 您必须调用 EndReceive。
EndReceive(或Receive)才能得到你想要的Message。如果您希望消息在处理期间发生异常(或断电或类似情况)时返回队列,您应该执行transactional receive。