c# - vista - ¿Pueden los enlaces crear pérdidas de memoria en WPF?




unmanaged memory c# (2)

Desde http://msdn.microsoft.com/en-us/library/aa970850.aspx , WPF usa patrones de eventos débiles, que no tienen referencias fuertes a los objetos y permiten que sean GC si son las únicas referencias a un objeto.

"Muchos aspectos del enlace de datos de WPF ya tienen el patrón de evento débil aplicado en la forma en que se implementan los eventos".

¿Debo desvincular los elementos a medida que el elemento desaparece para evitar pérdidas de memoria? Supongo que estoy un poco preocupado de que si vuelvo a cargar y se aplica una nueva plantilla a un control, y en esa plantilla existe un enlace a un elemento externo, ¿podría eso evitar que el control hecho para la plantilla sea recolectado como basura?


No pretendas responder, solo como referencia. En un artículo clásico sobre cómo blogs.msdn.com/b/jgoldb/archive/2008/02/04/… autor de blogs.msdn.com/b/jgoldb/archive/2008/02/04/… Jossef Goldberg , se describe en casos detallados, donde puede haber una pérdida de memoria en la aplicación WPF. Realmente, la mayoría se relaciona con .NET 3.5 / 4.0, pero algunos casos pueden ser relevantes para este día. Además, tenga una pequeña extension .

Cita sobre fugas en Binding :

Cause:

Esta filtración documentada en este artículo kb . Se desencadena porque:

El control TextBlock tiene un enlace a un objeto (myGrid) que tiene una referencia de regreso al TextBlock (es uno de los elementos secundarios de myGrid).

Note: este tipo de pérdida de enlace de datos es exclusivo de un escenario específico (y no de todos los escenarios de enlace de datos) tal como se documenta en el artículo kb . La propiedad en la Path no es una DependencyProperty ni una clase que implementa INotifyPropertyChanged y, además, debe existir una cadena de fuertes reverencias.

Código:

myDataBinding = new Binding("Children.Count");
myDataBinding.Source = myGrid; 
myDataBinding.Mode = BindingMode.OneWay;
MyTextBlock.SetBinding(TextBlock.TextProperty, myDataBinding);

El mismo código con fugas también se puede escribir en XAML:

<TextBlock Name="MyTextBlock" 
           Text="{Binding ElementName=myGrid, Path=Children.Count}" />

Fix/Workaround:

Hay pocos enfoques, el más fácil es simplemente borrar el enlace cuando las ventanas están a punto de cerrarse.

p.ej:

BindingOperations.ClearBinding(MyTextBlock, TextBlock.TextProperty);

Otro enfoque es establecer el modo del enlace de datos a OneTime. Vea el artículo kb para otras ideas.

Enlace útil:

Evitar una pérdida de memoria WPF con DataBinding





memory-leaks