Производительность Counter - System.InvalidOperationException: Категория не существует

У меня есть следующий класс, который возвращает количество текущих запросов в секунду для 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 минуту назад).

12
задан nikib3ro 25 November 2011 в 06:06
поделиться