1

我正在尝试创建一组供我的 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)中,计数器似乎没有记录任何增量。计数器实例本身是可用的,但它们都只显示“--”用于最后/平均/最小/最大显示。

关于我可能做错了什么的任何想法?

编辑:是我用作参考的 [可能有些过时的] MSDN 文章

编辑 2:我正在使用 VS 2008/.NET Framework v3.5 SP1,如果这有什么不同的话。

编辑 3:刚刚发现这篇关于 32 bit/64 bit app and monitor mismatching的文章,但我不确定它如何适用于我的情况,如果有的话。Cassini 确实是一个 32 位应用程序,但我在 64 位系统上查看值没有问题。在我的生产服务器上,应用程序和系统都是 64 位的,但我看不到值。

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

编辑 5:它实际上似乎在工作,只是我不得不重新启动我的 perfmon 实例,因为它在创建计数器之前是打开的。

4

1 回答 1

1

我读到实例化 PerformanceCounter 非常耗费资源。您是否想过将这些缓存在 Session / Application 变量中?

此外,在不锁定多线程 ASP.net 应用程序的情况下更新计数器是否明智?

帕特里克

于 2009-01-12T15:32:26.647 回答