/ / C # Запити на PerformanceCounter / Sec не оновлюється - c #, asp.net, iis-7, performancecounter

C # PerformanceCounter Requests / Sec не оновлено - c #, asp.net, iis-7, performancecounter

Я створюю програму, де мені потрібно отримати деякі значення з лічильника продуктивності.

Поки що це добре працює. Але коли я намагався отримати лічильник "Requests / Sec" для конкретного веб-сайту IIS, я взагалі не отримую будь-яких значень, як-от його не оновлення. Але якщо я зареєструю "Монітор продуктивності" на своєму комп'ютері з 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());
}

Дякую за ваш час.

Відповіді:

1 для відповіді № 1

Вам потрібно тримати примірник цього лічильника продуктивності, а не повторно встановлювати його під час кожного дзвінка.

Наступний код буде зберігати лічильник навколо статичного члена та повторно використовувати цей примірник під час наступного виклику до вашого методу:

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());
}