У меня есть приложение WinForms (я использую VB), которое можно свернуть в системный трей. Я использовал «хакерские» методы, описанные в нескольких сообщениях, используя NotifyIcon и играя с событием Form_Resize.
С эстетической точки зрения все это работает отлично, но на используемые ресурсы и память это не влияет. Я хочу иметь возможность минимизировать ресурсы при сворачивании в системный трей, как это делает Visual Studio. Если вы кодируете в Visual Studio, использование памяти может увеличиваться (в зависимости от размера проекта) до более 500 МБ, но при сворачивании Visual Studio на панель задач объем памяти резко уменьшается до (что я предполагаю) - это минимальный объем. .
Кто-нибудь знает, как это сделать?
Вот краткое описание приложения, если кто-то сочтет его подходящим: у меня есть форма Windows с ListView, которая содержит рабочие задания для моего ИТ-отдела. В приложении есть «слушатель», который уведомляет о отправке нового рабочего задания. Итак, когда приложение запущено в системном трее, все, что я действительно делаю, это сравниваю количество элементов в ListView с количеством строк в таблице SQL каждые пару минут.
Обновлено: Чтобы быть более конкретным, форма окна по сути имеет потоки и ресурсы, используемые с помощью элементов управления, когда форма невидима (в области уведомлений), эти ресурсы все еще используются. Что я могу сделать, чтобы свести к минимуму эти ресурсы, кроме как убить все элементы управления и перерисовать их при восстановлении формы.





Чтобы очистить неиспользуемую память, используйте GC.Collect () ... хотя вы должны прочитать, зачем это делать и почему часто использовать это - плохая идея.
Если вы имеете в виду другие ресурсы, вам нужно будет быть более конкретным.
Вероятно, вы ищете этот вызов функции: SetProcessWorkingSetSize
Если вы выполните вызов API SetProcessWorkingSetSize с -1 в качестве аргумента, Windows немедленно обрежет рабочий набор.
Однако, если большая часть памяти все еще занята ресурсами, которые вы не освободили, минимизация рабочего набора ничего не даст. Это в сочетании с предложением принудительной сборки мусора может быть вашим лучшим выбором.
Из описания вашего приложения вы можете также проверить, сколько памяти потребляет ListView, а также объекты доступа к базе данных. Я также не понимаю, как вы делаете эти вызовы базы данных мониторинга. Возможно, вы захотите выделить это в отдельный объект и не прикасаться ни к одной из форм в свернутом виде, в противном случае программа будет вынуждена сохранить элементы управления загруженными и доступными. Вы можете запустить отдельный поток для мониторинга и передать ListView.Count в качестве параметра.
Некоторые источники:
Вызов 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);
Хотя это на C#, посмотрите исходный код, он решит любые ваши проблемы:
Вы запускаете свое приложение вне VS, верно? Это увеличит использование памяти вашим приложением.