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