在 Mono 中获取 % 处理器时间

Posted

技术标签:

【中文标题】在 Mono 中获取 % 处理器时间【英文标题】:Get % Processor Time in Mono 【发布时间】:2015-03-17 05:57:09 【问题描述】:

我正在开展一个需要监控正在使用的 CPU 百分比的项目。它必须同时在 Mac 和 Windows 上,所以我使用 Mono 和 Xamarin。

我用来得到这个的代码是(这是一个测试,但计数器是一样的):

var cpuCounter = new PerformanceCounter

    CategoryName = "Processor",
    CounterName = "% Processor Time",
    InstanceName = "_Total"
;

cpuCounter.NextValue ();
Thread.Sleep (1000);

for (var i = 0; i < 50; i++) 
    Console.WriteLine (cpuCounter.NextValue());
    Thread.Sleep (1000);

在电脑上,这会返回任务管理器显示的内容。在 Mac 上,即使活动监视器显示不同,这也会在每个刻度上返回 100。

我试过谷歌搜索,但似乎没有任何效果。

想法?

【问题讨论】:

我们遇到了类似的问题。我们必须在目标 C 中运行代码才能完成。您可以在此处查看详细信息 -> ***.com/questions/11460184/… 这篇文章对理解cpus是如何工作的很有帮助,但是你有什么关于你是如何在objective c中实现它的指针吗?我试图自己实现一个目标 c 计数器,但没有成功。 我的回答对你有用吗?我已经在我的答案中添加了代码。 【参考方案1】:

我们遇到了类似的问题。我们解决它的方法是编写脚本。我将分享脚本中的代码。以及我们从 Mono 中调用它的方式。

脚本(我们称之为 getCPU.sh 并将其保存在 /Library/Application Support/UniqueApp)

#!/bin/bash
ps x -o pcpu,comm | grep UniqueApp

单码 -

  var psi = new ProcessStartInfo("/bin/sh", "\"/Library/Application Support/UniqueApp/getCPU.sh\"")
                              
                                  RedirectStandardOutput = true,
                                  UseShellExecute = false
                              ;
                Process p = Process.Start(psi);
                string outString = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                outString = outString.Substring(0, 5).Trim()

outString 将具有 UniqueApp 使用的 CPU 百分比

如果你想要整台机器的 CPU 百分比,请将 getCPU.sh 更改为以下代码 -

#!/bin/bash
ps x -o pcpu | tail -n+2| awk 's+=$1 END print s'

【讨论】:

抱歉,我花了几天时间才解决这个问题。我尝试了这个解决方案 - 我正在尝试获取整台机器的整体 cpu 使用率。有时值超过 100%。知道为什么会发生这种情况,您是否在您的应用中做了任何事情来处理这个问题? @mccow002 - 我们只监控应用程序使用的 CPU。因此,我们没有遇到您面临的问题,即价值超过 100%。你的mac是多核的吗?根据这个线程(forums.macrumors.com/showthread.php?t=1186691),i7 mac 上的进程可能高达 760%-800%。 那么你只需从 shell 脚本中获取数字,然后将其除以内核数,对吧? 太棒了。接受的答案

以上是关于在 Mono 中获取 % 处理器时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Reactive 并行处理 List<Mono<Object>>

Mono.Linker.MarkException:错误处理方法:'System.Void AndroidX.RecyclerView.Widget.RecyclerView/LayoutManage

如何结合 Mono 和 Flux 作为参数来创建新的 Mono?

Spring WebFlux,单元测试 Mono 和 Flux

在 C++ 中使用 Mono 获取程序集类

在 Mono + FastCGI 中托管 ServiceStack 时二进制数据损坏