2014-11-04 60 views
3

创建性能计数器,我试图这样的:“类别不存在”。为MSMQ队列

using System.Diagnostics; 

// ... 
var queueCounter = new PerformanceCounter(
    "MSMQ Queue", 
    "Messages in Queue", 
    @"machinename\private$\testqueue2"); 

Console.WriteLine("Queue contains {0} messages", 
    queueCounter.NextValue().ToString()); 

从此帖一: Is there a way to check how many messages are in a MSMQ Queue?

有同样的错误提及,但没有解决使用的PerformanceCounter时。

我还发现在这里提到: Performance Counter - System.InvalidOperationException: Category does not exist

然而,这个线程就这样开始了确切的话题,但在回答最初的问题上如何处理错误之前去了另一个方向。基本上我不需要知道每秒的记录,我只需要知道队列何时开始备份。

是什么导致了这个错误?我试过指向私有队列和公共队列,并指向队列中有消息。

编辑: 我已经在perfmon中添加了计数器,以确保我的服务器路径和队列名称正确。

+0

我在本地安装MSMQ,并且似乎越来越近了原来的错误点。我可以新增PerformanceCounter()。不幸的是,我刚刚毕业于相同问题的新版本:当我尝试读取计数时,实例'private $ \ '在指定的类别中不存在。 – Roger 2014-11-05 16:14:17

回答

1

好吧......算了一下。队列名称本身不包含它们运行的​​machineName的全限定名称。我通过使用PerformanceCounterCategory.GetInstanceNames()发现了这一点。这给你正确的队列名称。该修补程序是使用PerformanceCounter的最后一个构造函数来新建的,该构造函数允许您指定机器名称。我指定的队列名称是计算机名称,但计算机名称是完全合格的:

new PerformanceCounter("MSMQ Queue", "Messages in Queue", @"<machine name>\private$\dispatch", @"<fully qualified machine name>"))