如何检查公共MSMQ是否为空

Jus*_*tin 4 c# msmq netmsmqbinding

有没有办法检查公共MSMQ是否为空?对于私人MSMQ,这很容易:

private bool IsQueueEmpty(string path)
        {
            bool isQueueEmpty = false;
            var myQueue = new MessageQueue(path);
            try
            {
                myQueue.Peek(new TimeSpan(0));
                isQueueEmpty = false;
            }
            catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                {
                    isQueueEmpty = true;
                }
            }
            return isQueueEmpty;
        }
Run Code Online (Sandbox Code Playgroud)

我如何对公共MSMQ进行同样的检查?如果我尝试使用上面的代码检查一个公共MSMQ,它会在峰值上给我一个错误:

System.ArgumentOutOfRangeException:Length不能小于零.

Joh*_*ski 7

我刚刚开始使用Message Queues,但我的同事有一个很好的方法来检查队列是否为空:

if (MessageQueue.Exists(fullQueuePath))
{
    // FYI, GetMessageQueue() is a helper method we use to consolidate the code
    using (var messageQueue = GetMessageQueue(fullQueuePath))
    {
        var queueEnum = messageQueue.GetMessageEnumerator2();

        if (queueEnum.MoveNext())
        {
            // Queue not empty
        }
        else
        {
            // Queue empty
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法的好处是它不会抛出异常,我认为它不要求您等待超时发生.


LBu*_*kin 5

Peek只有在使用直接格式名称访问队列时,该方法才可用于远程计算机.您应该能够使用相同的代码,只要您不依赖目录服务就可以进入队列.

直接队列名称通常类似于: DIRECT=URLAddressSpecification/QueueName