2010-01-08 18 views
5

Cuando creo un control de usuario que tiene un enlace de comando a un RoutedUICommand me preocupa que tenga pérdidas de memoria.Pérdida de memoria de enlace de comando en WPF

escenario:

Tener un RoutedUICommand como estática en la clase C donde almaceno mis órdenes implementar el CommandBindings en un control de usuario. Agregue el control de usuario al formulario principal. Elimine el control de usuario del formulario principal, establezca las referencias a null.

El canExecute de los enlaces de comando continúa disparando. No tengo una referencia al UserControl por lo que se filtró. y sigue disparando durante mucho tiempo después de que se cierra la forma. (No lo he visto parar) Si fuerzo una recolección de basura, se recoge (bueno, el canExecute deja de disparar)

Tengo una prueba project que lo ilustra. Tengo Console.WriteLine en canExecute que imprime el código hash del objeto que dispara el método. Tiene un botón para agregar un nuevo control de usuario y otro para eliminarlo.

¿No debería preocuparme por esto? el control del usuario sí se recopila si se lo fuerza. ¿Esto significa que se recogerá en la próxima colección? Estoy notando una disminución en el rendimiento en nuestra aplicación y estoy rastreando pérdidas de memoria, etc. tenemos formularios complicados con muchos elementos de la interfaz de usuario y están ocupados utilizando el procesador y el espacio de memoria, cuando se eliminan del diseño. (usamos muchos comandos). Pensé que una vez que se eliminó algo del árbol visual ya no podría recibir eventos enrutados. ¿Qué me estoy perdiendo?

Respuesta

1

Desde mi entender, los enlaces de comandos utilizan algo similar a (pero no lo mismo que) el WeakEvent pattern.

Básicamente, se lleva a cabo un WeakReference. Esto le permitirá funcionar después de que su referencia haya desaparecido, pero no impedirá que su clase sea recopilada por el GC cuando nada más lo haga referencia.

En resumen, no se preocupe, está funcionando de la manera en que debería funcionar.