我试图弄清楚为什么某些性能计数器在我们的生产服务器上没有更新,当我遇到这个奇怪的问题时 – 计数器似乎在不是只读时返回不同的RawValue值。 只读时总是为零,当不是只读时,它显示不同的值。
这是我的PowerShell会话显示这个:
PS C:Usersdoron> $counter = new-object Diagnostics.PerformanceCounter PS C:Usersdoron> $counter.CategoryName = "My category" PS C:Usersdoron> $counter.CounterName = "My counter name" PS C:Usersdoron> $counter.ReadOnly = 1 PS C:Usersdoron> $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:Usersdoron> $counter.ReadOnly = 0 PS C:Usersdoron> $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:Usersdoron> $counter.ReadOnly = 1 PS C:Usersdoron> $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还是不。
如何获得一个稳定的机器ID **没有**pipe理员权限
在线程中调用列表框
win32 API和.NET框架之间的select
通过本地networking的URL调用子程序?
任何想法可能是什么原因造成的?
如何通过键查找/检查字典值
C#的devise模式,并基于string参数调用不同的方法
使用Console.WriteLine(C#)或printfn(F#)编写粗体文本?
向GAC注册/安装大会的“正确”方式是什么?
既然你没有提供很多关于你如何创建性能计数器的信息,以及谁在什么时候更新了计数器,我只能做出明智的猜测,并告诉你两者之间的区别。
当ReadOnly=True与Readonly=False时, RawValue差异
根据MSDN:
如果您正在读取的计数器是只读的,则在调用该属性时获取RawValue属性对计数器进行采样。此操作等同于对NextSample方法进行初始调用。
资料来源: http : //msdn.microsoft.com/de-de/library/system.diagnostics.performancecounter.rawvalue.aspx
事实上,您可以通过查看RawValue属性的实际框架来源来确认这一点:
public long RawValue { get { if (this.ReadOnly) return this.NextSample().RawValue; this.Initialize(); return this.sharedCounter.Value; } ... }
MSDN并没有说当将ReadOnly设置为False时会发生什么,但是看上面的代码片段会看到它将调用Initialize ,然后返回由Initialize创建的内部sharedCounter对象的值。 尽管Initialize在各个地方被调用,只有第一次调用才会真正初始化对象。
因为代码是相当复杂的,我不理解完整的过程,但是当性能计数器不是只读的,看起来这个值会被缓存,所以你会看到一个旧的值。
可能的解释
我必须在这里猜测,因为你没有说你是如何做实际的测试,但是如果你在更新任何值之前初始化性能计数器,那么我会假设你每次看到一个0的RawValue,即使计数器被更新同时。
现在,只要将ReadOnly设置为True并再次查询RawValue,您就会看到PerformanceCounter此时的实际值。
一个有趣的实验是调用NextSample()而不是使用RawValue 。 在我看来,你应该在这两种情况下得到相同的结果。
希望这可以帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。