我正在编写一个程序,需要从性能计数器中获取一些值。
到目前为止,一切正常。但是,当我尝试获取特定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());
}