У меня есть следующий класс, который возвращает число текущего запроса в секунду IIS. Я каждую минуту вызываю RefreshCounters, чтобы обновить значение Requests per Second (потому что оно среднее, и если я слишком долго его старую, это слишком сильно повлияет на результат)... и когда мне нужно отобразить текущую 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 правильно? Что я делаю неправильно, так что иногда я получаю исключение?
EDIT: И только для записи я размещаю этот класс на веб-сайте IIS (то есть, конечно, размещен в пуле приложений, который имеет административные привилегии) и вызывает методы из службы ASMX. Сайт, который использует значения счетчика (отображает их), вызывает RefreshCounters каждые 1 минуту и RequestsPerSecond каждые 5 секунд; RequestPerSecond кэшируются между вызовами.
Я вызываю RefreshCounters каждые 1 минуту, потому что значения, как правило, становятся "устаревшими" - на них слишком влияют более старые значения (например, 1 минута назад).