2009-03-09 5 views
5

Il semble que l'utilisation d'une ressource DynamicResource pour faire référence à une ressource de niveau application peut provoquer des fuites de mémoire.L'utilisation de DynamicResource pour une ressource au niveau de l'application peut provoquer des fuites

S'il vous plaît voir ce forum WPF post pour plus d'informations, comment le reproduire, et quelques solutions de contournement.

Ma question est la suivante: y a-t-il quelqu'un d'autre? Si oui, comment avez-vous travaillé autour de cela? Par ailleurs, il semble y avoir beaucoup de situations où cette fuite ne se produit pas, et peut-être la meilleure question est: quelles sont exactement les situations où cette fuite se produit et ne se produit pas?

Pour plus de commodité est ici le code qui reproduit:

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."); 
    } 
} 

Répondre

4

Microsoft a confirmed que c'est un bug et qu'il est fixé dans .NET 4.0.

Pour autant que je sache, ce bogue se reproduit uniquement si l'objet qui utilise DynamicResource pour faire référence à une ressource de niveau application ... ne fait jamais partie de l'arborescence visuelle. J'adorerais voir des contre-preuves à cela ... ou des précisions sur le moment où cette fuite se produit.

Mise à jour: Ce bogue a également été corrigé dans .NET 3.5. Voir ce chaud fix pour plus d'informations.

Questions connexes