c# - 在 C# 中获取特定进程的磁盘使用情况
问题描述
如何在 C# 中获取特定进程的磁盘使用率 (MB/s)?
我能够像这样获得 CPU 使用率和 RAM 使用率:
var cpu = new PerformanceCounter("Process", "% Processor Time", ProcessName, true)
var ram = new PerformanceCounter("Process", "Working Set - Private", ProcessName, true);
Console.WriteLine($"CPU = {cpu.NextValue() / Environment.ProcessorCount} %");
Console.WriteLine($"RAM = {ram.NextValue() / 1024 / 1024} MB");
但我找不到与磁盘使用相关的任何内容。
如任务管理器中所示:
解决方案
♻️ 方法
此 API 将告诉您 I/O 操作的总数以及总字节数。
您可以调用 GetProcessIoCounters 来获取每个进程的整体磁盘 I/O 数据 -您需要自己跟踪增量并转换为基于时间的速率。
所以,根据这个 C# 教程,你可以按照这些思路做一些事情:
struct IO_COUNTERS
{
public ulong ReadOperationCount;
public ulong WriteOperationCount;
public ulong OtherOperationCount;
public ulong ReadTransferCount;
public ulong WriteTransferCount;
public ulong OtherTransferCount;
}
[DllImport("kernel32.dll")]
private static extern bool GetProcessIoCounters(IntPtr ProcessHandle, out IO_COUNTERS IoCounters);
public static void Main()
{
IO_COUNTERS counters;
Process[] processes = Process.GetProcesses();
foreach(Process process In processes)
{
try {
GetProcessIoCounters(process.Handle, out counters);
console.WriteLine("\"" + process.ProcessName + " \"" + " process has read " + counters.ReadTransferCount.ToString("N0") + "bytes of data.");
} catch (System.ComponentModel.Win32Exception ex) {
}
}
console.ReadKey();
}
使用它来将其转换为 VB.NET
但是(System.ComponentModel.Win32Exception ex)发生
System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.OpenProcessHandle(Int32 access)
at System.Diagnostics.Process.get_Handle()
at taskviewerdisktest.Form1.Main() in C:\...\source\repos\taskviewerdisktest\taskviewerdisktest\Form1.vb:line 32
有些流程似乎真的很难访问.. 好消息是,在我的情况下,它们中的数量并不多(250 个中的 15 个或其他)..
⚠️免责声明:这更像是一种“解决方案”而不是“解决方案”
♻️ 其他方法和参考
推荐阅读
- ios - 如何将单元格中单击的按钮上的数据传递到另一个表格视图?
- javascript - 如何在 MVC C# 项目中使用单独的 Javascript 文件在 Ajax 调用中正确使用 url
- intellij-idea - 如何从文本文件中删除所有空格
- html - 如何根据父类激活嵌套类?
- windows - WMI CommandLineTemplate 变量切断
- angular - Angular:未捕获的错误:组件 BucketGridComponent 不是任何 NgModule 的一部分,或者该模块尚未导入您的模块
- ruby-on-rails - HighCharts 工具提示点格式不更新标签
- python - 如何使用熊猫中其他列的 .size() 值创建一个新列?
- ios - Ionic 应用程序未从 iOS 上的“ionic://localhost/”提供
- r - tidyr::pivot_wider 中的 values_fill 参数不起作用