Se puede producir una pérdida de memoria cuando utiliza el enlace de datos en Windows Presentation Foundation

Seleccione idioma Seleccione idioma
Id. de artículo: 938416 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza enlace de datos en Microsoft Windows Presentation Foundation (WPF), se puede producir una pérdida de memoria.

Causa

Este problema ocurre cuando se cumplen las condiciones siguientes:
  • Una ruta de enlace de datos hace referencia a la propiedad P de objeto X.
  • Objeto X contiene una referencia directa o una referencia indirecta al destino de la operación de enlace de datos.
  • Para tener acceso P a propiedad se utiliza un objeto PropertyDescriptor en lugar de un objeto de DependencyProperty o un objeto de PropertyInfo .

Solución

Para evitar este problema, utilice uno de los métodos siguientes.

Método 1

Tener acceso a propiedad P a través de un objeto de DependencyProperty .

Método 2

Exponer la interfaz INotifyPropertyChanged en objeto X.

Método 3

Establecer el modo de enlace de datos a OneTime .

Estado

Este comportamiento es por diseño.

Más información

En WPF, una operación de enlace de datos que no está marcada como OneTime debe escuchar las propiedad notificaciones de cambio del objeto de origen (objeto X). WPF usa las notificaciones de la clase DependencyProperties integradas o las notificaciones de la interfaz INotifyPropertyChanged .

Si la clase DependencyProperties y la interfaz INotifyPropertyChanged no están disponibles, WPF usa el evento ValueChanged . Este comportamiento implica llamar al método PropertyDescriptor.AddValueChanged en el objeto PropertyDescriptor que corresponde a la propiedad P. Por desgracia, esta acción hace que common language runtime (CLR) crear una referencia fuerte a partir de este objeto a objeto de PropertyDescriptor X. CLR también mantiene una referencia al objeto PropertyDescriptor en una tabla global. Este comportamiento hace que una cadena de referencia en el orden siguiente:
  1. Tabla global
  2. El objeto PropertyDescriptor
  3. Object X
  4. El destino de enlace de datos

    Nota La referencia entre objeto X y el destino de enlace de datos está causada por la primera condición que se muestra en la sección "Causa".
  5. Enlace
Siempre que se utiliza el enlace de datos de destino, debe continuar el enlace escuchar los cambios. Este comportamiento mantiene la referencia activo entre el objeto PropertyDescriptor y objeto X, y el destino permanece en uso. Este comportamiento provoca una pérdida de memoria en el objeto X y en cada objeto para el objeto que hace referencia X. Estos objetos incluyen el destino de enlace de datos.

Método de solución 1 y el método de solución 2 producir WPF utilice uno de los mecanismos de notificación preferido. Método de solución 3 indica a WPF no para escuchar las notificaciones de cambio. Todos los métodos de solución de tres evitar crear la referencia entre el objeto PropertyDescriptor y objeto X.

En el ejemplo de código siguiente, se crean las condiciones de la pérdida.
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
en este ejemplo de código, la propiedad Count representa la propiedad P. Además, el objeto X está representado por clase UIElementCollection en el formulario de la propiedad StackPanel.Children .

La primera condición en la sección "Causa" se cumple porque el objeto X hace referencia a los objetos secundarios del objeto X. Estos nodos secundarios incluyen el destino de enlace y el destino de enlace es el elemento TextBlock .

La segunda condición en la sección "Causa" se cumple porque la propiedad P no es un objeto de DependencyProperty y objeto X no implementa la interfaz INotifyPropertyChanged . Este comportamiento hace que la clase UIElementCollection y el elemento TextBlock no liberarse. Además, la clase de contenedor StackPanel no se libera, ya que la clase UIElementCollection contiene una referencia a la clase de contenedor StackPanel . Este comportamiento se produce incluso si la clase UIElementCollection y elemento TextBlock se quitan del árbol principal mediante la línea siguiente de code:
MyLabel.Content = <Some New Content>;

Propiedades

Id. de artículo: 938416 - Última revisión: jueves, 26 de julio de 2007 - Versión: 1.1
La información de este artículo se refiere a:
  • Microsoft .NET Framework 3.0
Palabras clave: 
kbmt kbtshoot kbprb KB938416 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 938416

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com