У меня есть следующий класс, который возвращает количество текущих запросов в секунду для IIS. Я вызываю RefreshCounters каждую минуту, чтобы обновлять значение запросов в секунду (потому что оно среднее, и если я буду держать его слишком долго, старое значение будет слишком сильно влиять на результат) ...и когда мне нужно отобразить текущий RequestsPerSecond, я вызываю это свойство.
public class Counters
{
private static PerformanceCounter pcReqsPerSec;
private const string counterKey = "Requests_Sec";
public static object RequestsPerSecond
{
get
{
lock (counterKey)
{
if (pcReqsPerSec != null)
return pcReqsPerSec.NextValue().ToString("N2"); // EXCEPTION
else
return "0";
}
}
}
internal static string RefreshCounters()
{
lock (counterKey)
{
try
{
if (pcReqsPerSec != null)
{
pcReqsPerSec.Dispose();
pcReqsPerSec = null;
}
pcReqsPerSec = new PerformanceCounter("W3SVC_W3WP", "Requests / Sec", "_Total", true);
pcReqsPerSec.NextValue();
PerformanceCounter.CloseSharedResources();
return null;
}
catch (Exception ex)
{
return ex.ToString();
}
}
}
}
Проблема в том, что следующее исключение иногда выдается:
System.InvalidOperationException: Category does not exist.
at System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine,\ String category)
at System.Diagnostics.PerformanceCounter.NextSample()
at System.Diagnostics.PerformanceCounter.NextValue()
at BidBop.Admin.PerfCounter.Counters.get_RequestsPerSecond() in [[[pcReqsPerSec.NextValue().ToString("N2");]]]
Я неправильно закрываю предыдущие экземпляры PerformanceCounter? Что я делаю неправильно и иногда получаю это исключение?
РЕДАКТИРОВАТЬ: И для записи, я размещаю этот класс на веб-сайте IIS (который, конечно, размещен в пуле приложений с правами администратора) и вызов методов из службы ASMX. Сайт, который использует значения счетчиков (отображает их), вызывает RefreshCounters каждые 1 минуту и RequestsPerSecond каждые 5 секунд; RequestPerSecond кэшируются между вызовами.
Я вызываю RefreshCounters каждую минуту, потому что значения имеют тенденцию становиться «устаревшими» - слишком на них влияют более старые значения (которые были актуальными, например, 1 минуту назад).