.NET Минимизирует к Лотку И Минимизирует требуемые ресурсы

Если у вас C # 7.3 или новее, вы можете использовать расширение, сделанное для оператора fixed, которое может использовать любой подходящий метод GetPinnableReference для типа (который есть у Span и ReadOnlySpan):

fixed (byte* bp = bytes) {
    ...
}

Поскольку мы имеем дело с указателями, это, конечно, требует unsafe контекста.

C # 7.0 до 7.2 не имеют этого, но допускают следующее:

fixed (byte* bp = &bytes.GetPinnableReference()) {
    ...
}
8
задан Joey 4 November 2008 в 20:39
поделиться

4 ответа

Вызов MiniMizeMemory () сделает сборку "мусора", обрежет процесс рабочий размер, затем уплотнит "кучу" процесса.

public static void MinimizeMemory()
{
    GC.Collect(GC.MaxGeneration);
    GC.WaitForPendingFinalizers();
    SetProcessWorkingSetSize(
        Process.GetCurrentProcess().Handle,
        (UIntPtr)0xFFFFFFFF,
        (UIntPtr)0xFFFFFFFF);

    IntPtr heap = GetProcessHeap();

    if (HeapLock(heap))
    {
        try
        {
            if (HeapCompact(heap, 0) == 0)
            {
                // error condition ignored
            }
        }
        finally
        {
            HeapUnlock(heap);
        }
    }
}

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SetProcessWorkingSetSize(
    IntPtr process,
    UIntPtr minimumWorkingSetSize,
    UIntPtr maximumWorkingSetSize);

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr GetProcessHeap();

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool HeapLock(IntPtr heap);

[DllImport("kernel32.dll")]
internal static extern uint HeapCompact(IntPtr heap, uint flags);

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool HeapUnlock(IntPtr heap);
8
ответ дан 5 December 2019 в 13:02
поделиться

Вы, вероятно, ищете этот вызов функции: SetProcessWorkingSetSize

Если Вы выполните вызов API SetProcessWorkingSetSize с-1 как аргумент, то Windows сразу обрежет рабочий набор.

Однако, если большая часть памяти все еще сохранена ресурсами, Вы не выпустили уменьшение рабочего набора, ничего не сделает. Это объединилось с предложением принуждения Сборки "мусора", мог бы быть Ваш лучший выбор.

Из Вашего описания приложения Вы могли бы хотеть также проверить, сколько памяти ListView использует, а также объекты доступа к базе данных. Я также не ясен о том, как Вы выполняете тех, которые контролируют вызовы базы данных. Вы могли бы хотеть изолировать это в отдельный объект и постараться не касаться любой из форм, в то время как минимизировано, иначе программа будет вынуждена сохранить средства управления загруженными и доступными. Вы могли запустить отдельный поток для контроля и передать ListView. Количество в качестве параметра.

Некоторые источники:

Приложения.NET и рабочий набор

Сколько памяти мой.Net Application использует?

3
ответ дан 5 December 2019 в 13:02
поделиться

Для чистки неиспользованной памяти используйте GC.Collect ()..., хотя необходимо читать на том, почему делать это и почему обычно плохая идея часто использовать его.

Если Вы будете иметь в виду другие ресурсы, то необходимо будет быть более конкретными.

2
ответ дан 5 December 2019 в 13:02
поделиться

В то время как это находится в C#, посмотрите на исходный код, он решит любые проблемы, которые Вы имеете:

http://www.codeproject.com/KB/cs/NotifyIconExample.aspx

0
ответ дан 5 December 2019 в 13:02
поделиться