.NET свернуть в лоток и минимизировать необходимые ресурсы - PullRequest
8 голосов
/ 04 ноября 2008

У меня есть приложение WinForms (я использую VB), которое можно свернуть в системный трей. Я использовал «хакерские» методы, описанные в нескольких постах, используя NotifyIcon и играя с событием Form_Resize.

Все это прекрасно работает эстетически, но используемые ресурсы и память остаются неизменными. Я хочу иметь возможность минимизировать ресурсы при сворачивании в системный трей, как это делает Visual Studio. Если вы кодируете в Visual Studio, использование памяти может увеличиться (в зависимости от размера проекта) до 500 МБ, но при сворачивании Visual Studio на панель задач объем памяти резко уменьшается до (что я предполагаю) минимального объема ,

Кто-нибудь знает, как этого добиться?

Вот краткое описание приложения, если кто-то посчитает его актуальным: у меня есть форма Windows с ListView, которая содержит рабочие задания для моего ИТ-отдела. В приложении есть «слушатель», который уведомляет, когда отправляется новый рабочий заказ. Поэтому, когда приложение работает в системном трее, все, что я действительно делаю, это сравниваю количество элементов в ListView с количеством строк в таблице SQL каждые пару минут.

РЕДАКТИРОВАТЬ: Чтобы быть более точным, форма окна по сути имеет потоки и ресурсы, используемые посредством элементов управления, когда форма невидима (в системном трее), эти ресурсы все еще используются. Что можно сделать, чтобы минимизировать эти ресурсы, если не считать уничтожение всех элементов управления и перерисовывание их при восстановлении формы.

Ответы [ 4 ]

8 голосов
/ 05 ноября 2008

Вызов 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);
3 голосов
/ 04 ноября 2008

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

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

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

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

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

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

Сколько памяти использует мое приложение .Net?

2 голосов
/ 04 ноября 2008

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

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

0 голосов
/ 18 ноября 2008

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

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

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