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

Begin reading(dequeue) from MSMQ then stop the dequeue process and then again start in C#

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

_queue.ReceiveCompleted += new ReceiveCompletedEventHandler(RecieveQ_ReceiveCompleted);
_queue.BeginReceive();

但是,在出队过程之间,我想停止它,然后在稍后的某个时间再次启动它,具体取决于用户输入。我遇到了 EndReceive(IAsyncResult asyncResult) 方法,但无法正确实现它。

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

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

在您的事件处理程序中,您然后调用 EndReceive() 从队列中获取项目,然后进行处理。请注意,如果另一个项目到达队列,它将不会被处理。

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

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

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

参考文献:https://msdn.microsoft.com/en-us/library/43h44x53(v=vs.110).aspx#Anchor_4

In asynchronous processing, you use BeginReceive to raise the ReceiveCompleted event when a message has been removed from the queue.

The MessageQueue can then access the message by calling EndReceive(IAsyncResult).

Once an asynchronous operation completes, you can call BeginPeek or BeginReceive again in the event handler to keep receiving notifications.

希望对您有所帮助