根据当前的实现,C#代码将消息添加到MSMQ,然后在特定操作完成后,我需要出列并开始处理它们。使用以下代码:
_queue.ReceiveCompleted += new ReceiveCompletedEventHandler(RecieveQ_ReceiveCompleted);
_queue.BeginReceive();
然而,在出列过程之间,我想要停止它,然后在某个时候再次启动它,具体取决于用户输入。我遇到了EndReceive(IAsyncResult asyncResult)
方法,但无法正确实现。
答案 0 :(得分:1)
BeginReceive()
和EndReceive()
不是用于启动和停止队列,例如打开和关闭水龙头(或水龙头)。
在MSMQ中,当您调用BeginReceive()
时,会生成第二个线程,该线程等待消息进入队列。当消息到达时,它会调用您的RecieveQ_ReceiveCompleted
事件处理程序。
在您的事件处理程序中,然后调用EndReceive()
从队列中获取项目,然后进行处理。请注意,如果另一个项目到达队列,则不会对其进行处理。
如果要重复处理队列项,则必须从事件处理程序中再次调用BeginReceive()
。
如果要在每个项目之后暂停处理以等待来自用户的信号来处理下一个项目,则需要从事件处理程序发信号通知项目已被处理,以及事件处理程序或主要事件线程需要再次调用BeginReceive()
。
根据您的具体情况,您可能会发现使用Receive()
方法而不是异步版本更容易控制您的操作顺序。
参考文献:https://msdn.microsoft.com/en-us/library/43h44x53(v=vs.110).aspx#Anchor_4
在异步处理中,当从队列中删除消息时,使用BeginReceive引发ReceiveCompleted事件。
然后,MessageQueue可以通过调用EndReceive(IAsyncResult)来访问该消息。
异步操作完成后,您可以在事件处理程序中再次调用BeginPeek或BeginReceive以继续接收通知。
希望这有帮助