【问题标题】:Read and remove all messages in a MSMQ (via RemoveCurrent method)读取和删除 MSMQ 中的所有消息(通过 RemoveCurrent 方法)
【发布时间】:2015-08-24 15:21:17
【问题描述】:

我尝试通过 GetMessageEnumerator2 方法从 MSMQ 读取所有消息,但始终只获得 1 条消息,而使用 GetAllMessages 方法,我获得正确数量的消息...

以下代码中的“错误”在哪里:

//var messages = queue.GetAllMessages(); // HERE I HAVE 5 MESSAGES
var messages = queue.GetMessageEnumerator2();
ReadQueryMessages(messages, removeAfterRead: true);

//...

ReadQueryMessages(MessageEnumerator enumerator, bool removeAfterRead = true)
{
    List<Message> messages = new List<Message>();
    // enumerator.Reset(); - didn't help
    while (enumerator.MoveNext(new TimeSpan(0, 0, 1)))
    {
        messages.Add(enumerator.Current);
        if (removeAfterRead)
            enumerator.RemoveCurrent();
    }
    // process messages - HERE I HAVE ONLY 1 FIRST MESSAGE
}

PS (对于“重复版主”)
我的问题不是问 HOW,而是 WHY 只有一个 删除时

【问题讨论】:

标签: c# .net msmq


【解决方案1】:

我不知道为什么RemoveCurrent 不起作用(或起作用,但会中断队列读取),但我通过添加queue 作为参数进行了修复:

List<ELetter> ReadQueryMessages(MessageQueue queue, 
                                MessageEnumerator enumerator, 
                                bool removeAfterRead = true)
{
    List<Message> messages = new List<Message>();
    while (enumerator.MoveNext(new TimeSpan(0, 0, 1)))
    {
        messages.Add(enumerator.Current);
        if (removeAfterRead)
            queue.ReceiveById(enumerator.Current.Id); 
            // enumerator.RemoveCurrent(); - this does not work properly!
    }
    // here I have 5 messages in the list - OK.
}

【讨论】:

  • RemoveCurrent 将枚举数移动到队列中的下一项,因此在这种情况下您实际上是在调用MoveNext 两次
  • Anway,为什么只有 5 条消息中的一条?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2017-11-12
  • 2014-04-22
  • 1970-01-01
相关资源
最近更新 更多