C#使用GetProcessIoCounters每秒读取磁盘IO总量(接近实时)
我一直在谷歌搜索,阅读各种帖子、解决方案等;但我无法找到或弄清楚如何实现我想要的东西 长话短说,我需要显示每个进程每秒的磁盘IO读写总量。为此,我找到了GetProcessIoCounters(),它应该可以完成这个任务 问题是计算数据并相应地显示它 定义如下:C#使用GetProcessIoCounters每秒读取磁盘IO总量(接近实时),c#,.net,winapi,C#,.net,Winapi,我一直在谷歌搜索,阅读各种帖子、解决方案等;但我无法找到或弄清楚如何实现我想要的东西 长话短说,我需要显示每个进程每秒的磁盘IO读写总量。为此,我找到了GetProcessIoCounters(),它应该可以完成这个任务 问题是计算数据并相应地显示它 定义如下: [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetProcessIoCounters(IntPtr hProc
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetProcessIoCounters(IntPtr hProcess, out IO_COUNTERS lpIoCounters);
[StructLayout(LayoutKind.Sequential)]
public struct IO_COUNTERS
{
public UInt64 ReadOperationCount;
public UInt64 WriteOperationCount;
public UInt64 OtherOperationCount;
public UInt64 ReadTransferCount;
public UInt64 WriteTransferCount;
public UInt64 OtherTransferCount;
};
每秒检索和更新一次数据:
NativeFunctions.IO_COUNTERS lpIo = new NativeFunctions.IO_COUNTERS();
if (NativeFunctions.GetProcessIoCounters(ProcessList.ProcessData.Handle, out lpIo))
{
ProcessList.io = lpIo;
}
完成此操作后,我需要能够说:“I/O总计:X/s”。为此,我想到了以下几点:
ulong total = ProcessList.io.ReadOperationCount + ProcessList.io.WriteOperationCount + ProcessList.io.OtherOperationCount;
total *= 1024;
total /= 1;
但结果并不像预期的那样。我需要查看当前使用的总I/O,而不是进程启动后的总I/O
你能给我指一下正确的方向吗
谢谢你的帮助
IntPtr hProcess = GetCurrentProcess();
IO_COUNTERS lpIo1 = new IO_COUNTERS();
IO_COUNTERS lpIo2 = new IO_COUNTERS();
GetProcessIoCounters(hProcess, out lpIo1);
int Sec = 1;
Thread.Sleep(Sec * 1000);
GetProcessIoCounters(hProcess, out lpIo2);
ulong total1 = lpIo1.ReadOperationCount + lpIo1.WriteOperationCount + lpIo1.OtherOperationCount;
ulong total2 = lpIo2.ReadOperationCount + lpIo2.WriteOperationCount + lpIo2.OtherOperationCount;
ulong total = (total2 - total1) / Convert.ToUInt64(Sec);
Sec
是两个GetProcessIoCounters
之间的间隔时间。我使用Thread.Sleep(Sec*1000)
来模拟Sec
秒的过程。您错误地识别了您的需求。您不需要当前的I/O读数。您需要在一个时间间隔内获得总I/O。如果您有一个全局累加器,您可以通过从当前的累计读数中减去t0处的读数来获得间隔内的增量。@IInspectable您在那里有一个点。你能在这里发布C#noob的样本吗?@NorbertBoros,IInspectable意味着你可以调用GetProcessIoCounters
两次,使用2rd-1st,然后除以所用时间。@DrakeWu MSFT你能发布答案吗?再一次,这里是C#noob。到目前为止,我只使用过C/C++,我发现C“管理得太多了”。工作起来很有魅力!