2012-06-22 18 views
6

Estamos escribiendo una herramienta de diagnóstico que debe ejecutarse durante muchas horas a la vez, pero nos encontramos con una misteriosa Excepción de falta de memoria cuando tratamos de eliminar elementos de un CheckedListBox después de que la aplicación se haya ejecutado por un par de horas.CheckedListBox pérdida de memoria

Inicialmente se trató de usar checkedListBox.Items.Clear();, y después de algunos googlear alrededor, nos hemos probado algo como lo siguiente en su lugar:

for (int i = checkedListBox.Items.Count - 1; i >= 0; i--) 
{ 
    checkedListBox.Items.RemoveAt(i); 
} 

Por desgracia, lo anterior no resolvió el problema. Encontré esa idea en los foros de MSDN, pero esta mañana no puedo encontrar el enlace de nuevo. Sin embargo, ese foro dijo que alguien había perfilado su aplicación y encontró una pérdida de memoria en CheckedListBox.Items.Clear().

¿Alguien sabe de un trabajo funcional?

EDIT: La respuesta de FingerTheCat tiene temporalmente resuelto nuestro problema, así que lo marcará como la respuesta por ahora. Sin embargo, hemos empezado a analizar el código para intentar encontrar el problema real. Desafortunadamente, la implementación actual es en gran parte código de espagueti, por lo que pueden pasar algunos días hasta que encontremos algo.

+0

¿Qué tipo de elementos está agregando al cuadro de lista marcada? Es posible que necesite hacer una limpieza explícita de estos objetos además de eliminarlos del cuadro de lista (como llamar a 'Dispose()' en ellos, etc.). – MusiGenesis

+0

¿Puedes resolver la fuga de memoria con for loop? – Damith

+3

Puede suponer con seguridad que CheckedListBox * * no tiene una pérdida de memoria. Use Perfmon.exe para observar los contadores de rendimiento de .NET y verificar que se realicen recolecciones de basura regulares. De lo contrario, tendrá que salir a buscar las llamadas faltantes de Dispose() en su aplicación. –

Respuesta

0

Resulta que alguien dejó un trozo de código de depuración en la aplicación que estaba agregando información de registro bastante verbosa a un ArrayList sin borrarlo nunca. Ese código también estaba anexando copias del ArrayList a sí mismo. Definitivamente no es algo bueno que se olvide de llevar a cabo.

-2

Lo mejor que puedo hacer, creo, es llamar al GarbageCollector en algunos puntos de su código. Simplemente agregue GC.Collect(); cerca de algunos bucles y debería solucionar tu problema de memoria.

+2

Esto ciertamente no es la solución correcta. GC.Collect() aún puede ser útil al diagnosticar el problema real. – Henrik

+1

Llamar a 'GC.Collect()' es * no * la solución. –