Утечка памяти с NotifyIcon при установке свойства значка? - PullRequest
1 голос
/ 05 сентября 2011

Я пытаюсь установить значок элемента управления notifyicon, но каждый раз, когда я изменяю свойство значка, я вижу, как увеличивается объем моей памяти для приложения, даже если я отпускаю значок.

Это мой код (c #):

public void CheckNotifyIcon(bool visible)
{

        if (notifyIcon.Icon != null)
            notifyIcon.Icon.Dispose();

            notifyIcon.Icon = visible 
                ? new Icon(Pic1, new Size(32, 32)) 
                : new Icon(Pic2, new Size(32, 32));
            notifyIcon.Visible = visible;

}

Что я сделал не так?

Спасибо!

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Вместо того, чтобы иметь один NotifyIcon и постоянно переключать его свойство Icon на временные экземпляры Icon, я бы создал два элемента управления NotifyIcon и соответственно отобразил бы / скрыл их. Таким образом, экземпляры Icon создаются только один раз за время существования формы, а не непрерывно удаляются и воссоздаются (и их окончательное удаление управляется для вас сантехническим кодом, который разработчик WinForms пишет для вас). Хотя это не скажет вам, где происходит утечка памяти, в первую очередь следует избегать ее.

1 голос
/ 05 сентября 2011

Как насчет запуска ANG Memory Profiler от Redgate , чтобы выяснить причину?

Кроме того, я бы предложил не поймать и съесть исключение, чтобы получить больше информации.

0 голосов
/ 06 сентября 2011

Прежде всего, нет никакого утечки в коде, который вы публикуете. Вы избавляетесь от значка и, конечно, сборщик мусора .net не протекает.

В комментарии к вопросу вы заявляете:

Я просто вижу увеличение памяти в taskmgr.exe, а не получить обратно.

Это источник вашей проблемы. Управление памятью в Windows чрезвычайно сложно, и диспетчер задач не является подходящим инструментом для диагностики утечек.

Объедините это с сборщиком мусора .net, и картина станет еще грязнее. Сборщик мусора может свободно хранить всю выделенную память как можно дольше, пока это не влияет на остальную часть системы.

Обнаружение утечек памяти в .net является сложной задачей и требует специальных инструментов.

...