【问题标题】:Performance Monitor .NET CLR Networking 4.0.0.0 Instance namingPerformance Monitor .NET CLR Networking 4.0.0.0 实例命名
【发布时间】:2011-12-28 09:33:10
【问题描述】:

我正在尝试使用性能计数器来确定我的应用程序发送或接收了多少字节。我遵循了此处找到的建议解决方案:Calculating Bandwidth,但我的应用程序实例未显示在“.NET CLR 网络”类别中。异常消息:

"实例 'ApplicationName[8824]' 不存在于指定的 类别”

(我在我的 App.config 中添加了<performanceCounters enabled="true"/>,但经过一些网络活动后仍然找不到它)

所以我启动了性能监视器,以便亲眼看到错误。正如预期的那样,我的应用程序没有出现在 .NET CLR Networking 类别中,但幸运的是它可以在 .NET CLR Networking 4.0.0.0 类别中找到。

但是,我的问题是我无法弄清楚实例名称是如何生成的。这是我在性能监视器中看到的实例的名称:ApplicationName.exe_p4952_r15_ad1

到目前为止,我已经发现第一部分必须由 ProcessNamePID 组成,但我 不知道最后两段("r15""ad1")来自什么。

有人知道最后两块是什么吗?

一种解决方案是枚举在“.NET CLR Networking 4.0.0.0”类别中找到的所有实例并搜索 ApplicationName.exe_PID*,但更愿意直接查找正确的名称(如果可能)。

【问题讨论】:

  • 你让它工作了吗?我似乎无法从计数器获得任何值。

标签: c# .net windows naming performancecounter


【解决方案1】:

查看this link 以获取有关如何构建名称的更多信息。简而言之,“rXX”是执行代码的公共语言运行时(实例)的运行时 ID。

建立这种新的命名约定是为了在并行场景中(您在一个进程中有多个 CLR 实例;这是从 .NET 4.0 开始的一项新功能),您实际上可以区分性能计数器。

上面的页面没有描述“adXX”,但从首字母缩写词中我想它代表应用程序域。该数字可能是应用程序域的AppDomain.Id

【讨论】:

    【解决方案2】:

    请参阅this answer,了解如何获取正确名称。简而言之,使用

    var processFileName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);
    var instanceName = VersioningHelper.MakeVersionSafeName(processFileName, ResourceScope.Machine, ResourceScope.AppDomain);
    

    【讨论】:

      【解决方案3】:

      应该是:

      string appDomain = AppDomain.CurrentDomain.FriendlyName.ToLower();
      string a = VersioningHelper.MakeVersionSafeName(appDomain, ResourceScope.Machine, ResourceScope.AppDomain);
      

      我在编写单元测试时遇到了带有进程名称的版本问题。具有应用程序域的版本适用于测试和应用程序结果与进程名称相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 2011-02-28
        • 2016-08-09
        • 2019-12-18
        • 1970-01-01
        相关资源
        最近更新 更多