有没有办法从队列中删除定义数量的消息,而不是使用.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;
}
答案 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)
重载并捕获在超时情况下抛出的MessageQueueException
。 MessageQueueException
类具有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;
}