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

时间:2017-06-12 13:31:21

标签: c# azure performancecounter azure-worker-roles

我试图阅读类别" HTTP服务请求队列中的性能计数器"在我的Azure辅助角色应用程序(C#)中。

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

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

给出null。

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

有人知道这方面的工作吗?

1 个答案:

答案 0 :(得分:0)

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

这与打开perfmon具有相同的效果,即默认情况下不存在的类别现在可用于我的应用程序。 确保在尝试访问计数器类别之前等待typeperf列表完成(在小型azure工作者角色实例上需要大约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侦听器后进行列表非常重要。否则您的实例将无法使用。我注意到了这一点,因为我尝试在工作人员角色启动之前将cmd作为启动任务运行,但这不起作用。