读取并删除MSMQ中的所有消息(通过removeccurrent方法)

本文关键字:消息 通过 removeccurrent 方法 删除 MSMQ 读取 | 更新日期: 2023-09-27 18:09:39

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

以下代码中的"bug"在哪里:

//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
}

p (duplicate-moderators)
我的问题不是问如何,而是问为什么在删除

读取并删除MSMQ中的所有消息(通过removeccurrent方法)

时只有一个

我不知道为什么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.
}