gpt4 book ai didi

.net - 使用 MessageEnumerator RemoveCurrent 我怎么知道我是否在队列末尾?

转载 作者:行者123 更新时间:2023-12-04 21:16:42 24 4
gpt4 key购买 nike

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

当我调用 MoveNext 来遍历队列时,我会返回一个 bool 值来告诉我当前消息是否存在。但是,当我执行 RemoveCurrent 时,如何知道移除后的当前消息是否存在?是检查 Current 并处理异常的唯一方法吗?

下面是一个示例,其中我使用了删除超过一年的消息的简单条件。假设队列是在别处创建的,并设置为 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
}
}
}

最佳答案

虽然迟到:

每次调用 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();
}
}
}

关于.net - 使用 MessageEnumerator RemoveCurrent 我怎么知道我是否在队列末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com