Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用GetProcessIoCounters每秒读取磁盘IO总量(接近实时)_C#_.net_Winapi - Fatal编程技术网

C#使用GetProcessIoCounters每秒读取磁盘IO总量(接近实时)

C#使用GetProcessIoCounters每秒读取磁盘IO总量(接近实时),c#,.net,winapi,C#,.net,Winapi,我一直在谷歌搜索,阅读各种帖子、解决方案等;但我无法找到或弄清楚如何实现我想要的东西 长话短说,我需要显示每个进程每秒的磁盘IO读写总量。为此,我找到了GetProcessIoCounters(),它应该可以完成这个任务 问题是计算数据并相应地显示它 定义如下: [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetProcessIoCounters(IntPtr hProc

我一直在谷歌搜索,阅读各种帖子、解决方案等;但我无法找到或弄清楚如何实现我想要的东西

长话短说,我需要显示每个进程每秒的磁盘IO读写总量。为此,我找到了GetProcessIoCounters(),它应该可以完成这个任务

问题是计算数据并相应地显示它

定义如下:

[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“管理得太多了”。工作起来很有魅力!