У нас есть приложение Windows Forms, которое содержит тысячи форм.
Многие из них временно отображаются в виде диалогов с помощью метода ShowDialog().
Это приложение существует уже много лет, и мы обнаружили, что многие формы не своевременно очищаются от мусора из-за различных утечек ресурсов в форме или используемых элементах управления.
В частности, мы обнаружили примеры ресурсов GDI+, которые не удаляются должным образом, хотя могут быть и другие типы утечек ресурсов, которые еще не охарактеризованы.
Хотя правильный способ решить эту проблему, очевидно, состоит в том, чтобы пройти через каждую форму и каждый элемент управления и устранить все проблемы с ресурсами. Это займет некоторое время.
В качестве краткосрочной альтернативы мы обнаружили, что явный вызов Dispose() в форме, по-видимому, инициирует процесс сборки мусора, и форма и ее ресурсы немедленно освобождаются.
Мой вопрос заключается в том, будет ли разумным обходным путем обернуть блок ShowDialog() каждой формы в оператор using, чтобы Dispose() вызывался после отображения формы, а также будет ли это хорошей практикой для учреждения в целом?
Например, измените существующий код следующим образом:
public void ShowMyForm()
{
MyForm myForm = new MyForm();
myForm.ShowDialog();
}
К этому:
public void ShowMyForm()
{
using (MyForm myForm = new MyForm())
{
myForm.ShowDialog();
}
}
В нашем тестировании метод MyForm Dispose() никогда не вызывается для первого примера, но он вызывается немедленно для второго примера.
Кажется ли это разумным подходом в качестве краткосрочного обходного пути, пока мы тратим время на отслеживание каждой из конкретных проблем с ресурсами?
Существуют ли другие подходы, которые мы могли бы рассмотреть в качестве краткосрочного временного решения и/или методологий для выявления и решения таких проблем с ресурсами?
Controls.Clear();
может привести к утечке памяти. См. комментарий Ханса здесь stackoverflow.com/a/7706549/939213. - person ispiro   schedule 29.11.2011