【问题标题】:Begin reading(dequeue) from MSMQ then stop the dequeue process and then again start in C#从 MSMQ 开始读取(出队),然后停止出队过程,然后再次在 C# 中启动
【发布时间】:2018-07-12 01:05:56
【问题描述】:

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

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

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

【问题讨论】:

  • 注意,“deque”不是“Dequeue”的缩写,实际上是“双端队列”的数据结构。
  • 刚刚提交了一个修改,将“deque”更改为“dequeue”,因为这似乎是一个真正的错误。

标签: c# message-queue msmq


【解决方案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 以继续接收通知。

希望对你有帮助

【讨论】:

  • 这些 API 还没有通过await 兼容的回报进行现代化改造?真不幸。
猜你喜欢
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多