6

.NET 上の MSMQ では、MessageEnumerator を使用して、キュー内のすべてのメッセージを調べています。特定の条件を満たすメッセージを削除したい。

MoveNext を呼び出してキューをステップスルーすると、現在のメッセージが存在するかどうかを示すブール値が返されます。しかし、RemoveCurrent を実行すると、削除後の現在のメッセージが存在するかどうかをどのように知ることができますか? Current をチェックして例外を処理する唯一の方法はありますか?

これは、1 年以上経過したメッセージを削除するという単純な条件を使用する例です。キューが別の場所で作成され、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
        }
    }
}
4

1 に答える 1

2

遅ればせながら:

RemoveCurrent() を呼び出すたびに、列挙子が無効になります。そのため、Enumerator (メッセージ キュー) の先頭から開始し続けるには、Reset() を呼び出す必要があります。

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

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

            // Handle Message
        }
        finally
        {
            me.Reset();
        }
    }
}
于 2014-09-19T03:33:07.120 に答える