ShowDialog () обходной путь утечки памяти - PullRequest
1 голос
/ 19 апреля 2011

В корпоративном решении моей компании я стараюсь устранить как можно больше утечек памяти.

У нас есть BaseCaptureForm, который наследуется многими другими формами (например, PracticeCaptureForm). Во всей системе (например) эта Рекомендация CaptureForm вызывается модально (ShowDialog ()). Теперь, насколько мне известно, когда формы открываются модально, они должны быть заключены в оператор using или удалены после завершения.

В BaseCaptureForm есть метод dispose, который никогда не срабатывает. Я вставил финализатор, и он тоже не попал. ANTS Memory Profiler показывает, что все эти формы сохраняются в памяти.

Есть ли у кого-нибудь предложения о том, как я могу избавиться от этих форм захвата (которые не открыты все это время), чтобы остановить утечку памяти? В системе миллионы вызовов ShowDialog, и мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой?

Редактировать Чтобы уточнить, есть ли что-то, что я могу сделать в BaseCaptureForm для автоматического удаления после закрытия? Я не могу пройти через все вызовы ShowDialog () в надежде избавиться от них. Вызов метода dispose в событии OnClosed формы вызывает неприятное мерцание.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

В зависимости от того, как вы используете формы после их закрытия (*), вы можете вызывать Dispose () из обработчика событий FormClosed.

Я не вижу "мерзкого мерцания", о котором вы говорите, вы можете попробовать установить this.Visible = false в обработчике событий FormClosed.

(*) Вы можете быть в безопасности, если не раскрываете какие-либо элементы управления или свойства элементов управления с помощью общедоступных свойств или методов вашей формы. Один из способов избежать этого - реализовать такие открытые свойства с полями поддержки и скопировать любые данные из элементов управления в эти поля поддержки до закрытия формы.

Без просмотра кода трудно понять, будет ли это реалистичным в вашем сценарии. И, честно говоря, я был бы склонен кусать пули и убирать звонки, добавляя using заявлений.

1 голос
/ 19 апреля 2011

К сожалению, нет простого способа сделать это. То, что у вас есть, это плохой код, и этот плохой код нужно исправить, как и весь другой плохой код: исправив его и заменив его хорошим кодом. Здесь нет бинтов, которые можно применить; лейкопластырь является финализатором Form вызова Dispose(), что никогда не гарантируется 1006 *. Если объект не подходит для сбора, ANTS Memory Profiler покажет вам, что удерживает ссылку на него.

1 голос
/ 19 апреля 2011

, если утилита диалога никогда не вызывается, это может быть индикатором исключения, которое выдается внутри вашей формы.Взгляните на этот blogpost .

Реализовали ли вы "Ms Dispose Pattern" ?Который может даже помочь с вашим решением.Может быть, вы можете предоставить какой-нибудь код?

Надеюсь, это поможет вам ...

...