使用MessageEnumerator RemoveCurrent如何知道我是否在队列末尾?

时间:2014-02-18 19:58:37

标签: .net message-queue msmq system.messaging messageenumerator

在.NET上的MSMQ中,我使用MessageEnumerator查看队列中的所有消息。我想删除符合特定条件的邮件。

当我调用MoveNext逐步执行队列时,我返回一个布尔值来告诉我当前消息是否存在。但是,当我执行RemoveCurrent时,如何知道删除后的当前消息是否存在?检查当前和处理异常的唯一方法是什么?

这是一个示例,我使用简单的条件删除超过一年的邮件。假设队列是在别处创建的,并使用MessageReadPropertyFilter.ArrivedTime = true进行设置:

private void RemoveOldMessages(MessageQueue q)
{
    MessageEnumerator me = q.GetMessageEnumerator2();
    bool hasMessage = me.MoveNext();
    while (hasMessage)
    {
        if (me.Current.ArrivedTime < DateTime.Now.AddYears(-1))
        {
            Message m = me.RemoveCurrent(new TimeSpan(1));
            // Removes and returns the current message
            // then moves to the cursor to the next message
            // How do I know if there is another message? Is this right?:
            try
            {
                m = me.Current;
                hasMessage = true;
            }
            catch (MessageQueueException ex)
            {
                hasMessage = false;
            }

        }
        else
        {
            hasMessage = me.MoveNext();
            // MoveNext returns a boolean to let me know if is another message
        }
    }
}

1 个答案:

答案 0 :(得分:1)

虽然迟来了:

每次调用RemoveCurrent()都会使枚举器失效。因此,您需要调用Reset()以保持在Enumerator(Message Queue)的开头处开始。

private void RemoveOldMessages(MessageQueue q)
{
    MessageEnumerator me = q.GetMessageEnumerator2();

    while (me.MoveNext())
    {
        try
        {
            Message m = me.RemoveCurrent();

            // Handle Message
        }
        finally
        {
            me.Reset();
        }
    }
}