我正在编写一个程序,需要从性能计数器中获取一些值。

到目前为止,一切正常。但是,当我尝试获取特定IIS站点的“ Requests / Sec”计数器时,根本没有得到任何值,例如未更新。
但是,如果我在Windows计算机上签到“性能监视器”,则可以看到相同的计数器起作用。

该程序具有管理员权限。

我的代码获取此计数器的代码段如下所示。

 public static int GetRequest()
    {

        var cat = PerformanceCounterCategory.GetCategories().FirstOrDefault(s => s.CategoryName.Contains("ASP.NET Apps v4.0.30319"));
        var catinstances = cat.GetInstanceNames().First(s => s.Contains("_lm_w3svc_3_root").ToUpper()));
        PerformanceCounter cpuCounter = new PerformanceCounter("ASP.NET Apps v4.0.30319", "Requests/Sec", catinstances, true);
        return unchecked((int)cpuCounter.NextValue());
    }


谢谢你的时间。

最佳答案

您需要保留该性能计数器的实例,而不是在每次调用时都对其进行实例化。

以下代码将计数器保留在一个静态成员中,并在下一次调用您的方法时重用该实例:

static PerformanceCounter _requestCounter; // keep instance around
static PerformanceCounter cpuCounter  // property with lazy init
{
   get
   {
      // initialize if we haven't done so.
      if (_requestCounter == null) {
        var cat = PerformanceCounterCategory.GetCategories().FirstOrDefault(s => s.CategoryName.Contains("ASP.NET Apps v4.0.30319"));
        var catinstances = cat.GetInstanceNames().First(s => s.ToUpper().Contains("_WEB"));
        _requestCounter = new PerformanceCounter("ASP.NET Apps v4.0.30319", "Requests/Sec", catinstances, true);

      }
      return _requestCounter;
   }
}

public static int GetRequest()
{
    return unchecked((int)cpuCounter.NextValue());
}

07-24 21:36