2009-03-09 5 views
5

Parece que el uso de DynamicResource para referirse a un recurso de nivel de aplicación puede causar pérdidas de memoria.El uso de DynamicResource en un recurso de nivel de aplicación puede ocasionar fugas

Consulte este foro de WPF post para obtener más información, cómo reproducirlo y algunas soluciones.

Mi pregunta es: ¿alguien más se ha topado con ella? Si es así, ¿cómo has trabajado alrededor?

Por cierto, parece haber muchas situaciones en las que esta fuga no ocurre, y quizás la mejor pregunta es: ¿cuáles son exactamente las situaciones en las que esta fuga ocurre y no ocurre?

Para mayor comodidad aquí es el código que lo reproduce:

App.xaml

<Application 
    x:Class="WeakReferences.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="Window1.xaml" 
> 
    <Application.Resources> 
     <SolidColorBrush x:Key="MyBrush" Color="SkyBlue"/> 
    </Application.Resources> 
</Application> 

Window1.xaml

<Window 
    x:Class="WeakReferences.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300" 
> 
    <Grid> 
     <Button 
      Name="ReleaseButton" 
      Content="Release Reference" 
      Click="Button_Click" 
     /> 
    </Grid> 
</Window> 

Window1.xaml.cs

public partial class Window1 : Window 
{ 
    object p; 

    public Window1() 
    { 
     InitializeComponent(); 

     p = new Page1(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    {    
     p = null; 

     GC.Collect(); 
    } 
} 

Page1.xaml

<Page 
    x:Class="WeakReferences.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Page1" 
    Background="{DynamicResource MyBrush}" 
> 
    <Grid> 
    </Grid> 
</Page> 

Page1.xaml.cs

public partial class Page1 : Page 
{ 
    public Page1() 
    { 
     InitializeComponent(); 
    } 

    ~Page1() 
    { 
     Trace.TraceInformation("Page1 Finalized."); 
    } 
} 

Respuesta

4

Microsoft tiene confirmed que esto es un error y que se fija en .NET 4.0.

Hasta donde puedo decir, este error solo se reproduce si el objeto que está utilizando DynamicResource para referirse a un recurso de nivel de aplicación ... nunca forma parte del árbol visual. Me encantaría ver alguna evidencia contraria a eso ... o más aclaraciones sobre cuándo se produce esta filtración.

Actualización: Este error también se ha corregido en .NET 3.5. Vea este caliente fix para más información.

Cuestiones relacionadas