C# 开始从MSMQ读取(出列),然后停止出列过程,然后再次在C中启动#

C# 开始从MSMQ读取(出列),然后停止出列过程,然后再次在C中启动#,c#,message-queue,msmq,C#,Message Queue,Msmq,根据当前的实现,C#代码将消息添加到MSMQ,然后在特定操作完成后,我需要退出队列并开始处理它们。使用以下代码: _queue.ReceiveCompleted += new ReceiveCompletedEventHandler(RecieveQ_ReceiveCompleted); _queue.BeginReceive(); 但是,在出列过程之间,我希望停止它,然后稍后再启动它,具体取决于用户输入。我遇到了EndReceive(IAsyncResult asyncResult)方法,但

根据当前的实现,C#代码将消息添加到MSMQ,然后在特定操作完成后,我需要退出队列并开始处理它们。使用以下代码:

_queue.ReceiveCompleted += new ReceiveCompletedEventHandler(RecieveQ_ReceiveCompleted);
_queue.BeginReceive();
但是,在出列过程之间,我希望停止它,然后稍后再启动它,具体取决于用户输入。我遇到了
EndReceive(IAsyncResult asyncResult)
方法,但无法正确实现它。

BeginReceive()和
EndReceive()
不像打开和关闭水龙头(或水龙头)那样用于启动和停止队列

在MSMQ中,当您调用
BeginReceive()
时,会生成第二个线程,等待消息进入队列。当消息到达时,它调用您的
receiveq\u ReceiveCompleted
事件处理程序

在事件处理程序内部,然后调用
EndReceive()
从队列中获取项目,然后进行处理。请注意,如果另一个项目到达队列中,则不会对其进行处理

如果要重复处理队列项目,必须从事件处理程序中再次调用
BeginReceive()

如果要在每个项目之后暂停处理,以等待来自用户的信号来处理下一个项目,则需要从事件处理程序发出已处理项目的信号,并且事件处理程序或主线程需要再次调用
BeginReceive()

根据您的情况,您可能会发现使用
Receive()
方法比使用异步版本更容易更好地控制操作顺序

参考资料:

在异步处理中,当消息从队列中删除时,使用BeginReceive引发ReceiveCompleted事件

然后,MessageQueue可以通过调用EndReceive(IAsyncResult)访问消息

异步操作完成后,可以在事件处理程序中再次调用BeginPeek或BeginReceive以保持接收通知


希望这有助于

小心,“deque”不是“Dequeue”的缩写,它实际上是指“双端队列”数据结构。只是提交了一个编辑,将“deque”更改为“Dequeue”,因为这似乎是一个真正的错误。这些API还没有现代化,具有
等待
兼容的返回?那太不幸了。