【发布时间】:2011-01-15 08:14:49
【问题描述】:
我有一个 Windows 服务,它通过 WCF 服务接口提供一些虚拟队列的消息。 我想公开两个性能计数器 -
- 队列中的项目数
- 每秒从队列中移除的项目数
第一个工作正常,第二个在 PerfMon.exe 中始终显示为 0,尽管 RawValue 看起来是正确的。
我正在创建这样的计数器 -
internal const string PERF_COUNTERS_CATEGORY = "HRG.Test.GDSSimulator";
internal const string PERF_COUNTER_ITEMSINQUEUE_COUNTER = "# Messages on queue";
internal const string PERF_COUNTER_PNR_PER_SECOND_COUNTER = "# Messages read / sec";
if (!PerformanceCounterCategory.Exists(PERF_COUNTERS_CATEGORY))
{
System.Diagnostics.Trace.WriteLine("Creating performance counter category: " + PERF_COUNTERS_CATEGORY);
CounterCreationDataCollection counters = new CounterCreationDataCollection();
CounterCreationData numberOfMessagesCounter = new CounterCreationData();
numberOfMessagesCounter.CounterHelp = "This counter provides the number of messages exist in each simulated queue";
numberOfMessagesCounter.CounterName = PERF_COUNTER_ITEMSINQUEUE_COUNTER;
numberOfMessagesCounter.CounterType = PerformanceCounterType.NumberOfItems32;
counters.Add(numberOfMessagesCounter);
CounterCreationData messagesPerSecondCounter= new CounterCreationData();
messagesPerSecondCounter.CounterHelp = "This counter provides the number of messages read from the queue per second";
messagesPerSecondCounter.CounterName = PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecondCounter.CounterType = PerformanceCounterType.RateOfCountsPerSecond32;
counters.Add(messagesPerSecondCounter);
PerformanceCounterCategory.Create(PERF_COUNTERS_CATEGORY, "HRG Queue Simulator performance counters", PerformanceCounterCategoryType.MultiInstance,counters);
}
然后,在每次服务调用时,我都会增加相关的计数器,对于每秒计数器,目前看起来像这样 -
messagesPerSecCounter = new PerformanceCounter();
messagesPerSecCounter.CategoryName = QueueSimulator.PERF_COUNTERS_CATEGORY;
messagesPerSecCounter.CounterName = QueueSimulator.PERF_COUNTER_PNR_PER_SECOND_COUNTER;
messagesPerSecCounter.MachineName = ".";
messagesPerSecCounter.InstanceName = this.ToString().ToLower();
messagesPerSecCounter.ReadOnly = false;
messagesPerSecCounter.Increment();
如前所述 - 如果我在调用 increment 之后放置一个断点,我可以看到 RawValue 不断增加,与对服务的调用一致(我认为相当频繁,每秒不止一次) 但性能计数器本身保持为 0。
提供“队列”上项目计数的性能计数器,其实现方式相同(尽管我分配的是 RawValue,而不是调用 Increment)工作得很好。
我错过了什么?
【问题讨论】:
-
您是否真的在每次递增时都创建一个 new 计数器?这不正确,只需创建一个。
-
所以 - 最初我没有,它仍然没有工作,但我不认为这是一个问题。事实上 - 我已经尝试了一个网络样本(codeguru.com/columns/dotnet/article.php/c7279),它工作得很好,并改变了它以每次重新创建性能计数器,它仍然有效(尽管我完全同意这不是最有效的方法。无论哪种方式 - 正如我所说的我都尝试过,这只是我不断尝试各种事情时代码的状态。
标签: c# performancecounter