运行 powershell 命令以在 c# 上按进程获取 GPU 使用情况

Posted

技术标签:

【中文标题】运行 powershell 命令以在 c# 上按进程获取 GPU 使用情况【英文标题】:Run power shell command to pickup GPU usage by process on c# 【发布时间】:2021-12-26 08:35:56 【问题描述】:

我尝试获取我的 c# 应用程序的 GPU 使用率,但我无法通过 NVDIA、AMD 或英特尔来实现这一点。 可以通过 powershell 获取该信息,例如:

   $p = Get-Process MyAPP; ((Get-Counter "\GPU Engine(pid_$($p.id)*engtype_3D)\Utilization Percentage").CounterSamples | where CookedValue).CookedValue |foreach Write-Output "$([math]::Round($_,1))%"

这显示了 gpu 的使用情况,并且在任何显卡上都像魅力一样工作。 如何以异步方式获取结果? 为了不创建阻塞线程而诅咒异步。

  PowerShell ps = PowerShell.Create();
  ps.AddScript(System.IO.File.ReadAllText(@"e:\gpu.ps"));  //the script.
  var gpu = ps.BeginInvoke();
  gpuinfobox.Text = gpu.ToString();  //of curse this not work!

【问题讨论】:

***.com/a/17640622/2864740 — 然后它可以用作 async/await。有关将 APM (Beginxx, Endxx) 转换为 TAP (async/await) 的更多详细信息,请参见 devblogs.microsoft.com/dotnet/… 参见docs.microsoft.com/en-us/dotnet/api/… 以及“异步调用命令。 使用 EndInvoke() 获取命令的输出。 您正在读取性能计数器。直接做就行了:docs.microsoft.com/en-us/dotnet/api/… 非常感谢 user2864740,现在正在工作! @user2864740 请作为答案发布,以便 OP 可以接受。否则,这个问题将一直“未得到解答”,遇到相同问题的人很少能找到它。 【参考方案1】:

这里是从您的应用或任何进程中获取 GPU 使用情况的完整代码,将其放入计时器中,每隔一秒触发一次。与英特尔、Nvidia、AMD 合作。

    System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
    dispatcherTimer.Tick += DispatcherTimer_Tick;
    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0,1000);
    dispatcherTimer.Start();


async  private void DispatcherTimer_Tick(object sender, EventArgs e)
 
    PowerShell ps = PowerShell.Create();
    ps.AddScript(System.IO.File.ReadAllText(@"e:\gpu.ps"));
    var task = Task<PSDataCollection<PSObject>>.Factory.FromAsync(ps.BeginInvoke(), ps.EndInvoke);
    var objs = await task;
    if (objs.Count > 0)
    
        var result = objs[0].ToString();
        TextBox.Text  =  string.IsNullOrEmpty(result) ? null : result;
    
 

脚本 gpu.ps:

$p = Get-Process YourApp; ((Get-Counter "\GPU Engine(pid_$($p.id)*engtype_3D)\Utilization Percentage").CounterSamples | where CookedValue).CookedValue |foreach Write-Output "$([math]::Round($_,1))%"

全局 gpu、cpu 等脚本,看一下: https://superuser.com/questions/1632758/how-to-get-gpu-usage-and-gpu-memory-info-of-a-process-by-powershell7

【讨论】:

以上是关于运行 powershell 命令以在 c# 上按进程获取 GPU 使用情况的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中运行 powershell 命令

powershell.exe 命令行变量

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

如何在 PowerShell 或 C# 中获取进程的命令行信息

如何在 powershell 中添加和使用 c# 结构

通过 C# 代码执行 Powershell 命令