运行 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 模块版本