Process.GetProcesses Утечка памяти - PullRequest
0 голосов
/ 26 ноября 2018

Я использую Process.GetProcesses(), чтобы получить все запущенные процессы на локальной машине, но у меня проблема с утечкой памяти, я думаю.

Это код, который возвращает мой список процессов:

List<Process> allProcess = Process.GetProcesses().Where((process) =>
{
    try
    {
        return process.GetMainModuleFileName().Contains("NAME") && !Native.IsResponding(process);
    }
    catch
    {
        return false;
    }
}).ToList();

Расширение GetModuleFileName (возвращает путь к файлу независимо от архитектуры)

public static string GetMainModuleFileName(this Process process, int buffer = 1024)
{
    var fileNameBuilder = new StringBuilder(buffer);
    uint bufferLength = (uint)fileNameBuilder.Capacity + 1;
    return QueryFullProcessImageName(process.Handle, 0, fileNameBuilder, ref bufferLength) ?
        fileNameBuilder.ToString() :
        null;
}

Функция IsResponding

public static bool IsResponding(Process process)
{
    HandleRef handleRef = new HandleRef(process, process.MainWindowHandle);
    int timeout = 2000;

    IntPtr lResult = SendMessageTimeout(
        handleRef,
        0,
        IntPtr.Zero,
        IntPtr.Zero,
        SMTO_ABORTIFHUNG,
        timeout,
        out IntPtr lpdwResult);

    return lResult != IntPtr.Zero;
}

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
    HandleRef hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam, 
    int flags, 
    int timeout, 
    out IntPtr pdwResult);
[DllImport("Kernel32.dll")]
private static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] uint dwFlags, [Out] StringBuilder lpExeName, [In, Out] ref uint lpdwSize);

Когда мои allProcess заполнены каким-либо результатом, память моего приложения увеличиваетсянемного и никогда не уменьшится.Я уже пробовал:

for(int i = allProcess.Count - 1; i >= 0; i--)
{
    allProcess[i].Dispose();
    allProcess[i] = null;
}

allProcess = null;

GC.Collect();
Native.CloseSharedResources();


public static void CloseSharedResources()
{
    PerformanceCounterPermission performanceCounterPermission = new PerformanceCounterPermission(PerformanceCounterPermissionAccess.Read, ".", "*");
    performanceCounterPermission.Demand();
}

Просто для проверки, когда я удаляю Process.GetProcesses(), память остается стабильной.Почему память никогда не уменьшается?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...