我正在正确创建和设置性能计数器但是当我删除类别时,重新创建具有相同名称的类别并将计数器添加/更新到该类别时,它无法更新计数器及其值。
以下代码第一次正常运行,但不是第二次。目前不需要删除“删除类别”的代码,但我希望每次部署应用程序时都能删除现有类别。
如果没有这样做或重置其值,我该如何永久删除该计数器?
private PerformanceCounter mainCounter;
private PerformanceCounter mainCounterBase;
private string category = "TestPerformanceCounterTest";
public void Test()
{
//Counter setup
if (PerformanceCounterCategory.Exists(category))
PerformanceCounterCategory.Delete(category);
if (!PerformanceCounterCategory.Exists(category))
{
var categoryCollection = new CounterCreationDataCollection();
var counter1 = new CounterCreationData("RawCounter1", "", PerformanceCounterType.RawFraction);
var counter2 = new CounterCreationData("RawCounterBase1", "", PerformanceCounterType.RawBase);
categoryCollection.Add(counter1);
categoryCollection.Add(counter2);
PerformanceCounterCategory.Create(category, "", PerformanceCounterCategoryType.SingleInstance, categoryCollection);
// Wait and wait...
Thread.Sleep(TimeSpan.FromSeconds(3));
}
//create counters
mainCounter = new PerformanceCounter(category, "RawCounter1", false);
mainCounterBase = new PerformanceCounter(category, "RawCounterBase1", false);
//reset values
mainCounter.RawValue = 0;
mainCounterBase.RawValue = 0;
//update counter
mainCounter.IncrementBy(10);
mainCounterBase.IncrementBy(20);
**Console.WriteLine("Main counter: " +mainCounter.RawValue);//doesnt show value 50 the second time this is run**
Console.WriteLine("Main counter Base: " + mainCounterBase.RawValue);
Console.WriteLine("Main counter next value: " + mainCounter.NextValue());
Console.WriteLine("Main counter base next value: " + mainCounterBase.NextValue());
}
答案 0 :(得分:4)
我很确定这是由于Windows管理性能数据的方式。
注意强> 强烈建议使用新的性能计数器 在安装应用程序期间创建类别,而不是 在执行应用程序期间。这允许时间 操作系统刷新其注册性能计数器列表 类别。如果列表尚未刷新,则尝试使用 类别将失败。
我没有第一手资料,但这表明添加或删除类别不是同步操作。
要解决此问题,您可能希望将第一个if
替换为while
,如下所示:
while (PerformanceCounterCategory.Exists(category))
{
PerformanceCounterCategory.Delete(category);
}
但是,这有点笨手笨脚。最好的建议是在您需要之前不要进行计数器设置或拆除。相反,将它放入安装程序,或者至少创建一个单独的工具来安装/卸载它们。此外,您可以创建一个Powershell脚本来安装/卸载它们。有关示例,请参阅http://msdn.microsoft.com/en-us/library/windowsazure/hh508994.aspx。