Если у вас C # 7.3 или новее, вы можете использовать расширение, сделанное для оператора fixed
, которое может использовать любой подходящий метод GetPinnableReference
для типа (который есть у Span
и ReadOnlySpan
):
fixed (byte* bp = bytes) {
...
}
Поскольку мы имеем дело с указателями, это, конечно, требует unsafe
контекста.
C # 7.0 до 7.2 не имеют этого, но допускают следующее:
fixed (byte* bp = &bytes.GetPinnableReference()) {
...
}
Вызов 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);
Вы, вероятно, ищете этот вызов функции: SetProcessWorkingSetSize
Если Вы выполните вызов API SetProcessWorkingSetSize с-1 как аргумент, то Windows сразу обрежет рабочий набор.
Однако, если большая часть памяти все еще сохранена ресурсами, Вы не выпустили уменьшение рабочего набора, ничего не сделает. Это объединилось с предложением принуждения Сборки "мусора", мог бы быть Ваш лучший выбор.
Из Вашего описания приложения Вы могли бы хотеть также проверить, сколько памяти ListView использует, а также объекты доступа к базе данных. Я также не ясен о том, как Вы выполняете тех, которые контролируют вызовы базы данных. Вы могли бы хотеть изолировать это в отдельный объект и постараться не касаться любой из форм, в то время как минимизировано, иначе программа будет вынуждена сохранить средства управления загруженными и доступными. Вы могли запустить отдельный поток для контроля и передать ListView. Количество в качестве параметра.
Некоторые источники:
Для чистки неиспользованной памяти используйте GC.Collect ()..., хотя необходимо читать на том, почему делать это и почему обычно плохая идея часто использовать его.
Если Вы будете иметь в виду другие ресурсы, то необходимо будет быть более конкретными.
В то время как это находится в C#, посмотрите на исходный код, он решит любые проблемы, которые Вы имеете: