.net ReadOnly=false时,性能计数器显示不同的值

.net ReadOnly=false时,性能计数器显示不同的值,.net,windows,powershell,performancecounter,.net,Windows,Powershell,Performancecounter,当我遇到这个奇怪的问题时,我正试图弄明白为什么我们的生产服务器中某些性能计数器没有更新——当计数器不是只读时,它似乎返回不同的RawValue值。只读时始终为零,非只读时显示不同的值 以下是我的PowerShell会话,其中显示: PS C:\Users\doron> $counter = new-object Diagnostics.PerformanceCounter PS C:\Users\doron> $counter.CategoryName = "My category"

当我遇到这个奇怪的问题时,我正试图弄明白为什么我们的生产服务器中某些性能计数器没有更新——当计数器不是只读时,它似乎返回不同的
RawValue
值。只读时始终为零,非只读时显示不同的值

以下是我的PowerShell会话,其中显示:

PS C:\Users\doron> $counter = new-object Diagnostics.PerformanceCounter
PS C:\Users\doron> $counter.CategoryName = "My category"
PS C:\Users\doron> $counter.CounterName = "My counter name"
PS C:\Users\doron> $counter.ReadOnly = 1
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : True
MachineName      : .
RawValue         : 0
Site             :
Container        :



PS C:\Users\doron> $counter.ReadOnly = 0
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : False
MachineName      : .
RawValue         : 20
Site             :
Container        :



PS C:\Users\doron> $counter.ReadOnly = 1
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : True
MachineName      : .
RawValue         : 0
Site             :
Container        :
服务器是Windows 2008 R2,运行.NET 4.5

一个重要的注意事项是,我所有的其他性能计数器都不是这样运行的,只有一些最近添加的性能计数器(这些计数器不工作)。对于所有其他计数器,RawValue id始终相同,无论是否为只读


你知道是什么原因导致了这种情况吗?

因为你没有提供很多关于如何创建性能计数器以及谁在什么时候更新计数器的信息,所以我只能做出明智的猜测,并告诉你两者之间的区别

ReadOnly=True
ReadOnly=False

根据MSDN:

如果您正在读取的计数器是只读的,则获取RawValue属性将在调用该属性时对计数器进行采样。此操作相当于对NextSample方法进行初始调用

来源:

实际上,您可以通过查看RawValue属性的实际框架源来确认这一点:

public long RawValue
{
  get
  {
    if (this.ReadOnly)
      return this.NextSample().RawValue;
    this.Initialize();
    return this.sharedCounter.Value;
  }
  ...
}
MSDN没有说明当
ReadOnly
设置为
False
时会发生什么,但是查看上面的代码段,您会看到它将调用
Initialize
,然后返回内部
sharedCounter
对象的值,该对象由
Initialize
创建<代码>初始化
在不同的地方被调用,只有第一次调用才会真正初始化对象

由于代码非常复杂,我不理解整个过程,但当性能计数器不是只读时,该值似乎将被缓存,因此您将看到一个旧值

可能的解释

我不得不在这里猜测,因为您没有说您实际上是如何进行测试的,但是如果您在更新任何值之前初始化了性能计数器,那么我会假设您每次都看到一个0的RawValue,即使同时更新了计数器

现在,只要将ReadOnly设置为True并再次查询RawValue,您就会看到PerformanceCounter此时的实际值

一个有趣的实验是调用
NextSample()
而不是使用
RawValue
。在我看来,你应该在两种情况下得到相同的结果


希望这有帮助

你能提供更多的信息吗?首先,你是如何得到美元的计数器值的。我在beginning@DoronYaacoby,你找到这个问题的解决办法了吗?我有完全相同的问题,并将非常感谢任何信息,可以导致一个解决方案。请…@DoronYaacoby,很抱歉再次询问,但如果您解决了此问题,解决方案是什么?如果您不想回复,请通过gmail dot的dnovatchev与我联系com@DimitreNovatchev对不起,没有,我从来没解决过。我们最终放弃了所有自定义性能计数器。当我试图通过PowerShell读取其值时,计数器已初始化并写入。此外,我的大多数计数器都可以工作,只有几个新添加的计数器表现异常。您能提供更多信息吗?如何创建计数器对象?如何写入/更新计数器?问题是只读和非只读对于RawValue的区别是什么。我看了一下实际的代码,得出了这个结论。这是唯一的区别。如果不是问题,那么你可能找错地方了。试着在一个小样本项目中重现这个问题。你也试过下一个例子吗?当ReadOnly=True时,计数器是否按预期工作。性能计数器的创建方式没有什么有趣的地方。它是完全标准的-我创建了一个CounterCreationData对象,该对象被添加到PerformanceCounterCollection,然后用于调用PerformanceCounterCategory.create.$counter.NextSample()生成0,无论计数器是否为只读。不,计数器没有按预期工作,无论我增加多少,它都将保持在0。这不会在示例项目中重现,此特定计数器有问题,我正在尝试了解问题所在。很抱歉,我无法提供更多帮助:-(代替做一个示例项目,也许你可以越来越多地减少实际项目,直到你有一个仍然发生错误的最低版本。除此之外,没有很多计数器真正区别开来……如果在示例项目中使用相同的计数器不会重现问题,那么我认为问题不在于t您是否设置了断点,添加了日志记录以确保性能计数器确实被写入?这是否可以在另一台计算机上重现?