2012-06-07 23 views
9

Quiero crear el diccionario de todos los ViewModels.WeakReference understanding

public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>(); 

Adición de ello como esto

vmCollection.Add(name, new WeakReference(viewModel)); 

y llamar al método requerido como esto ..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message); 

¿Es necesario mantenerla como WeakReference? ¿Cuáles podrían ser las consecuencias si no lo mantengo como WeakReference?

+3

no se olvide de comprobar si el objeto está vivo antes de acceder a él - IsAlive en WeakReference – Bond

+0

Si está buscando implementar una solución de tipo mensajería, ¿ha mirado el EventAggregator en Prism? – slugster

+0

Gracias slugster. Quiero implementarlo por mi cuenta para evitar cualquier tipo de dependencia ... –

Respuesta

14

La única consecuencia de no usar WeakReference es que la referencia en su diccionario evitará que las instancias de View Model sean recolectadas. Un WeakReference permite la recolección de basura (suponiendo que no haya otras referencias sólidas en otro lugar).

Un elemento es elegible para la recolección de basura cuando no tiene referencias. WeakReference no crea una referencia "contable", por lo que puede mantener una especie de referencia, pero aun así dejar que sea elegible si su WeakReference es lo único que queda.

Ya sea que lo necesite o no, realmente depende del tipo de ciclo de vida que tengan sus Modelos de Vista. Si necesitan deshacerse o "soltarlo", puede necesitar usar WeakReference o exponer una forma de eliminar la referencia del diccionario.

Como menciono en los comentarios. Tiendo a errar lejos de usar WeakReference en lugar de manejar explícitamente el ciclo de vida de los objetos relevantes. Dicho esto, son útiles cuando simplemente no tiene visibilidad del ciclo de vida en los puntos relevantes. Creo que en su situación, debe tener la visibilidad necesaria, ya que es probable que todos estén en la capa de interfaz de usuario, y por lo tanto debe intentar no usarlos.

Éstos son algunos recursos sobre el tema:

Directrices extraer de lo anterior MSDN enlace:

Utilizar referencias largas débiles sólo cuando sea necesario como el estado del objeto es usted npredictable después de la finalización.

Evite utilizar referencias débiles a objetos pequeños porque el puntero mismo puede ser igual o mayor.

Evite utilizar referencias débiles como una solución automática a la memoria problemas de gestión. En su lugar, desarrolle una política de caché efectiva para manejando los objetos de su aplicación.

Creo que el último punto de referencia se aplica a su situación.

+0

Muchas gracias Adam. ¿Será algún tipo de OverHead si en el lado más seguro lo uso? –

+2

@RaoBHavik La sobrecarga será el costo de la instancia del objeto 'WeakReference' en sí misma, y ​​la necesidad de comprobar constantemente si el objeto al que se hace referencia todavía se puede usar (obviamente, podría haberse recopilado desde la última vez que lo usó). Siempre me equivocaría al usarlos en lugar de manejar el ciclo de vida de los objetos explícitamente, pero a veces simplemente no tienes visibilidad del ciclo de vida para que puedan ser útiles. Creo que en tu caso deberías tener visibilidad, así que probablemente intentes no usarlos. –

Cuestiones relacionadas