Процент использования памяти - PullRequest
0 голосов
/ 04 сентября 2011

Как отобразить общее использование памяти в процентах, большинство работает на Windows XP и 7 (.net2)

Я попробовал следующие решения без успеха (сбой или зависание)

http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

и использование

System.GC.GetTotalMemory(true);

рабочий образец, спасибо Дарину,

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public class MEMORYSTATUSEX
    {
        public uint dwLength = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MEMORYSTATUSEX));
        public uint dwMemoryLoad;
        public ulong ullTotalPhys;
        public ulong ullAvailPhys;
        public ulong ullTotalPageFile;
        public ulong ullAvailPageFile;
        public ulong ullTotalVirtual;
        public ulong ullAvailVirtual;
        public ulong ullAvailExtendedVirtual;
    }
    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
    static extern bool GlobalMemoryStatusEx(MEMORYSTATUSEX lpBuffer);

    private void timer1_Tick(object sender, EventArgs e)
    {
        var result = new MEMORYSTATUSEX();
        if (GlobalMemoryStatusEx(result))
            getpercentage(((double)result.ullTotalPhys - result.ullAvailPhys) / result.ullTotalPhys);
    }

    static void getpercentage(double ratio)
    {
        string usage = string.Format("usage {0:0%}", ratio);
        Console.WriteLine(usage);
    }

1 Ответ

5 голосов
/ 04 сентября 2011

Если вы хотите использовать метод GlobalMemoryStatusEx, вот пример:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class MEMORYSTATUSEX
{
    public uint dwLength;
    public uint dwMemoryLoad;
    public ulong ullTotalPhys;
    public ulong ullAvailPhys;
    public ulong ullTotalPageFile;
    public ulong ullAvailPageFile;
    public ulong ullTotalVirtual;
    public ulong ullAvailVirtual;
    public ulong ullAvailExtendedVirtual;
    public MEMORYSTATUSEX()
    {
        this.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
    }
}

class Program
{
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

    static void Main()
    {
        MEMORYSTATUSEX result = new MEMORYSTATUSEX();
        if (GlobalMemoryStatusEx(result))
        {
            Console.WriteLine(
                "{0}% memory left", 
                100.0 * result.ullAvailPhys / result.ullTotalPhys
            );
        }
    }
}

Другая возможность, если вам не нравится Interop, - это использовать ComputerInfo класс (вам просто нужно добавить ссылку на сборку Microsoft.VisualBasic):

class Program
{
    static void Main()
    {
        Microsoft.VisualBasic.Devices.ComputerInfo ci = new Microsoft.VisualBasic.Devices.ComputerInfo();
        Console.WriteLine(
            "{0}% memory left",
            100.0 * ci.AvailablePhysicalMemory / ci.TotalPhysicalMemory
        );
    }
}

И еще одна возможность - запросить счетчики производительности, чтобы выяснить доступную память:

class Program
{
    static void Main()
    {
        // You could also use "Available Bytes", "Available KBytes", "Available MBytes"
        PerformanceCounter pc = new PerformanceCounter("Memory", "Available Bytes");
        Console.WriteLine(Convert.ToInt64(pc.NextValue()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...