.Net性能计数器在我致电时被损坏

时间:2018-06-26 16:13:36

标签: c# windows-services performancecounter

这似乎是一个常见问题?我编写了Windows服务,该服务获取了许多性能计数器,并读取了它们并报告了它们。我像这样抓住它们:

public override IEnumerable<IMetric> GetMetrics()
{
    var metrics = new List<IMetric>();
    try
    {
        using (var performanceCounter = new PerformanceCounter(PerformanceCounterCategoryName,
            PerformanceCounterName, InstanceName))
        {
            performanceCounter.NextValue();

            Thread.Sleep(SampleInterval);

            var nextValue = performanceCounter.NextValue();
            metrics.Add(new Metric(HostId, $"{PerformanceCounterCategoryName}:{PerformanceCounterName}",
                nextValue, MetricType.Gauge));
        }

        Logger.Debug($"{PerformanceCounterName} metric retrieved.");
    }
    catch (InvalidOperationException e)
    {
        Logger.Error(e,$"Monitor {nameof(GetType)} failed. Performance counter {PerformanceCounterCategoryName}:{PerformanceCounterName} does not exist.");
    }
    catch (Exception e)
    {
        Logger.Error(e, e.Message);
    }

    return metrics;
}

我每5分钟调用30个性能计数器。问题是,一旦启动服务,计数器就会损坏,尤其是.Net Memory计数器,我必须删除它们:

unlodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"

重建它们:

lodctr /R

重新安装它们:

lodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"

但是,一旦我启动服务,它们就会再次损坏。如何保持它们稳定?

1 个答案:

答案 0 :(得分:0)

似乎这与32 vs 64位有关。我试图将应用程序设置为64位应用程序,显然我没有正确配置它。我一改回32位,就可以正常工作。