ASP.NET/C#-自定义性能计数器仅在64位系统上的32位性能计数器中显示

ASP.NET/C#-自定义性能计数器仅在64位系统上的32位性能计数器中显示,c#,asp.net,performancecounter,C#,Asp.net,Performancecounter,我正在尝试创建一组自定义性能计数器,供我的ASP.NET应用程序使用。我使用以下代码递增计数器: internal static void Increment(String instanceName, DistributedCacheCounterInstanceType counterInstanceType) { var permission = new PerformanceCounterPermission(PerformanceCounterPermissionAccess.W

我正在尝试创建一组自定义性能计数器,供我的ASP.NET应用程序使用。我使用以下代码递增计数器:

internal static void Increment(String instanceName, DistributedCacheCounterInstanceType counterInstanceType)
{
    var permission = new PerformanceCounterPermission(PerformanceCounterPermissionAccess.Write, Environment.MachineName, "CounterName");
    permission.Assert();

    var counter = new PerformanceCounter("CategoryName", "CounterName", instanceName, false);
    counter.RawValue++; // Use RawValue++ instead of Increment() to avoid locking
    counter.Close();
}
这在单元测试中非常有效,在我的开发盒(Vista Business x64)上的Cassini中也非常有效。我可以在性能监视器中观察计数器的工作情况。但是,计数器似乎没有在我的生产环境(Win Server 2003 x64)中注册任何增量。计数器实例本身是可用的,但它们在最后一次/平均值/最小值/最大值显示时都只显示“-”

你知道我做错了什么吗

编辑:这里是

编辑2:我使用的是VS 2008/.NET Framework v3.5 SP1,如果这有什么区别的话

编辑3:刚刚找到,但我不确定它如何适用于我的情况,如果有的话。Cassini确实是一款32位应用程序,但我在64位系统上查看值时没有问题。在我的生产服务器上,应用程序和系统都是64位的,但我看不到值

编辑4:当我在生产服务器上运行32位perfmon时,会显示这些值。所以我想现在的问题是为什么我不能读取64位perfmon中的值


编辑5:它看起来确实在工作,只是我必须重新启动我的perfmon实例,因为它在创建计数器之前是打开的。

我了解到实例化PerformanceCounter需要大量资源。您是否想过将这些缓存在会话/应用程序变量中

另外,在多线程ASP.net应用程序中更新计数器而不锁定是否明智


Patrick

我读到实例化PerformanceCounter需要大量资源。您是否想过将这些缓存在会话/应用程序变量中

另外,在多线程ASP.net应用程序中更新计数器而不锁定是否明智


Patrick

实例化我的计数器似乎会带来一些开销,但目前还不足以要求缓存。是的,在这种情况下,由于锁定对性能的影响,绝对需要在不锁定的情况下进行更新。与精确的数字和糟糕的性能相比,使用稍微不准确的数字更好。实例化我的计数器似乎会带来一些开销,但目前还不足以要求缓存。是的,在这种情况下,绝对需要在不锁定的情况下更新,因为锁定会影响性能。与精确的数字和糟糕的性能相比,拥有稍微不准确的数字更好。