.Net 性能计数器在我调用时损坏

.Net Performance Counters Get Corrupted When I Call Them

这似乎是一个常见问题?我编写了一个 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 内存计数器,我必须删除它们:

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

重建它们:

lodctr /R

重新安装它们:

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

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

这似乎与 32 位和 64 位有关。我试图将应用程序设置为 64 位应用程序,但显然我没有正确配置它。我一切换回 32 位,它就完美运行了。