gpt4 book ai didi

msmq - 我可以查看空的 MSMQ 而不会出现异常吗?

转载 作者:行者123 更新时间:2023-12-04 14:07:36 27 4
gpt4 key购买 nike

据我从文档中看到,您应该检查消息队列中是否有消息的方法是使用 Peek 方法。然后,您依靠它失败并返回 MessageQueueException 来告诉您队列为空。

    public bool IsQueueEmpty()
{
bool isQueueEmpty = false;
MessageQueue myQueue = new MessageQueue(".\\myQueue");

try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}

catch(MessageQueueException e)
{
if (e.MessageQueueErrorCode ==
MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}

我一直被告知 - 并且经历过 - Exeptions 成本高昂,不应用于正常操作。所以我的问题是:
  • 我认为依靠捕获 MessageQueueException 是一项代价高昂的操作的假设是否正确?
  • 有什么方法可以同步检查队列中是否有消息而不必依赖异常?

  • 我正在使用 C# 中的 System.Messaging 命名空间,但是如果我需要不受管理地解决这个问题,那可能是一个选项。请注意,我想要一个不使用 WCF 和 MSMQ 的解决方案。

    最佳答案

  • 是的,您认为异常代价高昂是正确的。实际上,贵的是 throw ,而不是 catch 。队列有时为空是正常的,正常状态不应导致抛出异常。
  • 通过使用 MessageQueue.GetMessageEnumerator2,我们可以使用枚举器来确定队列是否为空,而无需加载所有消息。使用这种方法,我们永远不会加载超过一条消息。

  • 例子:
    private static bool IsQueueEmpty(MessageQueue queue)
    {
    using (var enumerator = queue.GetMessageEnumerator2())
    {
    return !enumerator.MoveNext();
    }
    }

    或者实现 Peek,如果消息队列为空则返回 null(未经测试,但应该可以工作)
    private static Message Peek(MessageQueue queue)
    {
    using (var enumerator = queue.GetMessageEnumerator2())
    {
    return enumerator.MoveNext() ? enumerator.Current : null;
    }
    }

    我们使用与原始代码类似的代码来检查大约 20 个不同的队列。由于我们从原始实现更改为我建议的实现,我们的导入速度大大提高,因为 CPU 可以更多地用于处理消息而不是处理抛出。

    关于msmq - 我可以查看空的 MSMQ 而不会出现异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1438774/

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