从消息队列中删除定义数量的消息

时间:2014-01-31 15:31:50

标签: c# msmq message-queue

有没有办法从队列中删除定义数量的消息,而不是使用.Purge()

我已经尝试设置MessageEnumerator并在完成当前消息后我需要做的任何事情时使用.RemoveCurrrent,但它似乎无效。

由于

public Message[] Get10(MessageQueue q)
    {

        int counter = 0;
        int mCount = 0;
        List<Message> ml = new List<Message>();
        try
        {
            MessageEnumerator me = q.GetMessageEnumerator2();
            while (me.MoveNext())
            {
                counter++;
            }
            if (counter > 10)
            {
                mCount = 10;
            }
            else
            {
                mCount = counter;
            }
            counter = 0;
            me.Reset();
            do
            {
                me.MoveNext();
                counter++;
                ml.Add(me.Current);
                me.RemoveCurrent();
            } while (counter < mCount);

        }

        catch (Exception x)
        {
            Console.WriteLine(x.Message);
        }
        Message[] m = ml.ToArray();
        return m;
    }

1 个答案:

答案 0 :(得分:1)

当您致电RemoveCurrent()时,枚举器将移至下一条消息。致电MoveNext()后,您无需致电RemoveCurrent()

您可以尝试的另一种方法如下:

    List<Message> ml = new List<Message>();
    int count = 0;

    while(  count < 10 ) {
        ml.Add(me.RemoveCurrent());
        ++count;
    }

在这种情况下,您必须知道如果队列中没有留言,RemoveCurrent将永远等待。如果这不是您想要的,您可能希望使用RemoveCurrent(TimeSpan timeout)重载并捕获在超时情况下抛出的MessageQueueExceptionMessageQueueException类具有MessageQueueErrorCode属性,如果超时已到期,则设置为MessageQueueErrorCode.IOTimeout

或者(这将最多得到 10条消息:如果队列中的消息计数降为零,循环将退出):

    List<Message> ml = new List<Message>();
    int count = 0;

    while( me.MoveNext() && count < 10 ) {
        ml.Add(queue.ReceiveById(me.Current.Id));
        ++count;
    }