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