public static void AttachPerformanceCountersCategoryInstance(
								string performanceCountersCategoryName
								, string performanceCountersCategoryInstanceName
							)
        {
            string key = string.Format
                                    (
                                        "{1}{0}{2}"
                                        , "-"
                                        , performanceCountersCategoryName
                                        , performanceCountersCategoryInstanceName
                                    );
            PerformanceCountersContainer container = null;
            if (!_dictionary.TryGetValue(key, out container))
            {
                container = new PerformanceCountersContainer();
                _dictionary.Add
                            (
                                key
                                , container //new PerformanceCountersContainer()
                            );
                container.AttachPerformanceCountersToProperties(performanceCountersCategoryInstanceName, performanceCountersCategoryName);
            }
        }
        public static void CountPerformance(
										MultiPerformanceCountersTypeFlags enabledPerformanceCounters
										, string performanceCountersCategoryName
										, string performanceCountersCategoryInstanceName
										, Action beforeCountPerformanceInnerProcessAction
										, Action countPerformanceInnerProcessAction
										, Action afterCountPerformanceInnerProcessAction
									)
        {
            if (enabledPerformanceCounters != MultiPerformanceCountersTypeFlags.None)
            {
                if (countPerformanceInnerProcessAction != null)
                {
                    string key = string.Format
                                            (
                                                "{1}{0}{2}"
                                                , "-"
                                                , performanceCountersCategoryName
                                                , performanceCountersCategoryInstanceName
                                            );
                    PerformanceCountersContainer container = null;
                    if (!_dictionary.TryGetValue(key, out container))
                    {
                        lock (_lockerObject)
                        {
                            container = new PerformanceCountersContainer();
                            _dictionary.Add
                                        (
                                            key
                                            , new PerformanceCountersContainer()
                                        );
                            container.AttachPerformanceCountersToProperties
                                                (
                                                    performanceCountersCategoryInstanceName
                                                    , performanceCountersCategoryName
                                                );
                        }
                    }
                    var enableProcessCounter =
                                                (
                                                    (enabledPerformanceCounters & MultiPerformanceCountersTypeFlags.ProcessCounter)
                                                    != MultiPerformanceCountersTypeFlags.None
                                                );
                    if (enableProcessCounter)
                    {
                        container.PrcocessPerformanceCounter.Increment();
                    }
                    var enableProcessingCounter =
                                                (
                                                    (enabledPerformanceCounters & MultiPerformanceCountersTypeFlags.ProcessingCounter)
                                                    != MultiPerformanceCountersTypeFlags.None
                                                );
                    if (enableProcessingCounter)
                    {
                        container.ProcessingPerformanceCounter.Increment();
                    }
                    var enableProcessedAverageTimerCounter =
                                                (
                                                    (enabledPerformanceCounters & MultiPerformanceCountersTypeFlags.ProcessedAverageTimerCounter)
                                                    != MultiPerformanceCountersTypeFlags.None
                                                );
                    container.ProcessedAverageTimerPerformanceCounter.ChangeAverageTimerCounterValueWithTryCatchExceptionFinally
                                                            (
                                                                enableProcessedAverageTimerCounter
                                                                , container.ProcessedAverageBasePerformanceCounter
                                                                , () =>
                                                                {
                                                                    if (countPerformanceInnerProcessAction != null)
                                                                    {
                                                                        if (beforeCountPerformanceInnerProcessAction != null)
                                                                        {
                                                                            beforeCountPerformanceInnerProcessAction();
                                                                        }
                                                                        countPerformanceInnerProcessAction();
                                                                        if (afterCountPerformanceInnerProcessAction != null)
                                                                        {
                                                                            afterCountPerformanceInnerProcessAction();
                                                                        }
                                                                    }
                                                                }
                                                                , null
                                                                , null
                                                            );
                    if (enableProcessingCounter)
                    {
                        container.ProcessingPerformanceCounter.Decrement();
                    }
                    var enableProcessedPerformanceCounter =
                                            (
                                                (enabledPerformanceCounters & MultiPerformanceCountersTypeFlags.ProcessedCounter)
                                                != MultiPerformanceCountersTypeFlags.None
                                            );
                    if (enableProcessedPerformanceCounter)
                    {
                        container.ProcessedPerformanceCounter.Increment();
                    }
                    var enableProcessedRateOfCountsPerSecondPerformanceCounter =
                                            (
                                                (enabledPerformanceCounters & MultiPerformanceCountersTypeFlags.ProcessedRateOfCountsPerSecondCounter)
                                                != MultiPerformanceCountersTypeFlags.None
                                            );
                    if (enableProcessedRateOfCountsPerSecondPerformanceCounter)
                    {
                        container.ProcessedRateOfCountsPerSecondPerformanceCounter.Increment();
                    }
                }
            }
            else
            {
                if (countPerformanceInnerProcessAction != null)
                {
                    countPerformanceInnerProcessAction();
                }
            }
        }
 public IEnumerable <PerformanceCounter> GetPerformanceCountersByLevel(int level)
 {
     return
         (PerformanceCountersContainer
          .GetPerformanceCountersByLevel(level));
 }