c# - tesis - Usar una declaración alrededor del formulario de diálogo para asegurar la recolección de basura
tesis de residuos solidos municipales (3)
En general, es una buena forma de usar la instrucción using
para los objetos que implementan IDisposable.
Una pequeña situación de muestra:
Digamos que tiene un "componente" de un tercero. No puede saber qué sucede internamente y tal vez este objeto cree un archivo temporal y elimine el archivo en Dispose
. Si no llama a Dispose()
y no lo using
el archivo nunca se eliminará.
En su caso, puede hacerlo también siempre que abra su formulario modal
.
Tenemos una aplicación de Windows Forms que contiene miles de formularios.
Muchos de estos se muestran temporalmente como diálogos a través del método ShowDialog ().
Esta aplicación ha existido durante años y hemos descubierto que muchos de los formularios no reciben basura recolectada de manera oportuna debido a varias filtraciones de recursos en la forma o los controles que utiliza.
Específicamente, hemos encontrado ejemplos de recursos de GDI + que no se eliminan correctamente, aunque puede haber otros tipos de pérdidas de recursos que aún no se han caracterizado.
Aunque la forma correcta de resolver esto es, obviamente, pasar por todas las formas y todos los controles y eliminar todos los problemas de recursos. Esto tomará un tiempo para lograrlo.
Como una alternativa a corto plazo, hemos encontrado que llamar explícitamente a Dispose () en el formulario parece iniciar el proceso de recolección de basura y la forma y sus recursos se desasignan inmediatamente.
Mi pregunta es si sería una solución razonable para envolver el bloque ShowDialog () de cada formulario en una declaración de uso para que se llame a Dispose () después de que se haya mostrado el formulario, y ¿sería una buena práctica instituir en general?
Por ejemplo, cambie el código existente de esto:
public void ShowMyForm()
{
MyForm myForm = new MyForm();
myForm.ShowDialog();
}
A esto:
public void ShowMyForm()
{
using (MyForm myForm = new MyForm())
{
myForm.ShowDialog();
}
}
En nuestras pruebas, nunca se llama al método Dispose () de MyForm para el primer ejemplo, pero se llama inmediatamente para el segundo ejemplo.
¿Esto parece un enfoque razonable como una solución a corto plazo mientras pasamos el tiempo rastreando cada uno de los problemas de recursos específicos?
¿Existen otros enfoques que podríamos considerar para una solución a corto plazo y / o metodologías para identificar y resolver este tipo de problemas de recursos?
Para diálogos modales, debe usar el patrón:
using ( var dlg = new MyDialog() )
{
// other code here to initialize, etc.
dlg.ShowDialog();
}
Como MyDialog se deriva de Formulario , y Form implementa IDisposable , este patrón limpiará correctamente su diálogo.
Esto no debe ser una "solución temporal a corto plazo", sino la forma estándar en que debe invocar todos sus diálogos modales.
Los diálogos sin formas son otra historia. Tendrá que hacer un seguimiento de ellos usted mismo, y llame a Dispose en los puntos apropiados en su aplicación.
Según MSDN , debe llamar explícitamente a Dispose en los formularios que se muestran con ShowDialog (a diferencia del método Show):
Cuando un formulario se muestra como un cuadro de diálogo modal, hacer clic en el botón Cerrar (el botón con una X en la esquina superior derecha del formulario) hace que el formulario se oculte y la propiedad DialogResult se establezca en DialogResult.Cancel. A diferencia de los formularios no modales, el .NET Framework no llama al método Close cuando el usuario hace clic en el botón Cerrar formulario de un cuadro de diálogo o establece el valor de la propiedad DialogResult. En cambio, el formulario está oculto y se puede volver a mostrar sin crear una nueva instancia del cuadro de diálogo. Como un formulario que se muestra como un cuadro de diálogo está oculto en lugar de cerrado, debe llamar al método de eliminación del formulario cuando la aplicación ya no lo necesita.