PerformanceCounter有时会抛出指定类别的计数器布局无效



我们正在监控几个PerformanceCounters在windows服务中每5分钟一次。有时我们的代码会抛出:

"错误消息:指定的类别的计数器布局无效,类型为:AverageCount64, AverageTimer32, CounterMultiTimer, CounterMultiTimerInverse, CounterMultiTimer100Ns, countermultitimer100nverse, RawFraction或SampleFraction的计数器必须紧接任何基本计数器类型:AverageBase, CounterMultiBase, RawBase或SampleBase。">

它看起来很像这个问题performanceccounter . nextvalue()抛出InvalidOperationException

我不确定这个异常何时发生。有时会稳定几天,然后就不稳定了。当我重新启动我们的服务时,它似乎解决了,但如果我们只是等待,它又开始工作了。我认为这与错误处理PerformanceCounter有关。也许GC最终会清理一些东西,然后重新开始工作?

代码:

private static float ReadPerformanceCounter(string CategoryName, string CounterName, string InstanceName)
{
using (PerformanceCounter performanceCounter = new PerformanceCounter())
{
performanceCounter.CategoryName = CategoryName;
performanceCounter.CounterName = CounterName;
performanceCounter.InstanceName = InstanceName;
// will always start at 0
var firstValue = performanceCounter.NextValue();
System.Threading.Thread.Sleep(1000);
// now matches task manager reading
var secondValue = performanceCounter.NextValue();

return secondValue;
}
}

它是这样命名的:

float processor = ReadPerformanceCounter("Processor", "% Processor Time", "_Total");
float disk = ReadPerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
float memory = ReadPerformanceCounter("Memory", "Page Reads/sec", null);
float networkClient = ReadPerformanceCounter("SMB Client Shares", "Avg. Data Queue Length", "_Total"):

问题是性能计数器SMB客户端共享并不总是可用(例如,只有当用户登录并具有网络驱动器映射时)。你得先核实一下。