Windows性能计数器无法从C#(在Azure worker角色上)获得

Windows性能计数器无法从C#(在Azure worker角色上)获得,c#,azure,performancecounter,azure-worker-roles,C#,Azure,Performancecounter,Azure Worker Roles,我正在尝试读取Azure worker角色应用程序(C#)中“HTTP服务请求队列”类别中的性能计数器 默认情况下,应用程序无法从该类别获取任何计数器,即 string performanceCategoryName = "HTTP Service Request Queues"; var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => categor

我正在尝试读取Azure worker角色应用程序(C#)中“HTTP服务请求队列”类别中的性能计数器

默认情况下,应用程序无法从该类别获取任何计数器,即

  string performanceCategoryName = "HTTP Service Request Queues";
  var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);
给出空值

但是,如果我将远程桌面连接到实例并启动perfmon,我可以在那里看到类别。如果我从perfmon查看它,然后重新启动应用程序,那么应用程序也可以读取计数器。好像perfmon创建了计数器,默认情况下它不在那里


有人知道解决这个问题的方法吗?

我通过启动cmd进程并在启动owin侦听器后从应用程序中调用“typeperf-q”解决了这个问题

这与打开perfmon的效果相同,即默认情况下不存在的类别现在可用于我的应用程序。 确保在尝试访问计数器类别之前等待typeperf列表完成(对于一个小型azure worker角色实例,这需要约20秒)

这就是我的工作原理:

        var startInfo = new ProcessStartInfo()
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "cmd.exe",
            Arguments = "/C typeperf.exe -q",
        };
        Process p = new Process() { StartInfo = startInfo };
        p.Start();
        p.WaitForExit(2*60*1000);

       string performanceCategoryName = "HTTP Service Request Queues";

       var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);

请注意,在注册应用程序http侦听器之后执行该列表非常重要。否则您的实例将不可用。我注意到了这一点,因为我试图在worker角色启动之前将cmd作为启动任务运行,但没有成功。

我通过启动cmd进程并在启动owin侦听器后从应用程序中调用“typeperf-q”来解决这一问题

这与打开perfmon的效果相同,即默认情况下不存在的类别现在可用于我的应用程序。 确保在尝试访问计数器类别之前等待typeperf列表完成(对于一个小型azure worker角色实例,这需要约20秒)

这就是我的工作原理:

        var startInfo = new ProcessStartInfo()
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "cmd.exe",
            Arguments = "/C typeperf.exe -q",
        };
        Process p = new Process() { StartInfo = startInfo };
        p.Start();
        p.WaitForExit(2*60*1000);

       string performanceCategoryName = "HTTP Service Request Queues";

       var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);
请注意,在注册应用程序http侦听器之后执行该列表非常重要。否则您的实例将不可用。我注意到了这一点,因为我试图在worker角色启动之前将cmd作为启动任务运行,但这不起作用