2009-03-09 12 views
5

Sembra che l'utilizzo di una risorsa dinamica per fare riferimento a una risorsa a livello di applicazione possa causare perdite di memoria.L'utilizzo di DynamicResource per una risorsa a livello di applicazione può causare perdite

Si prega di consultare questo forum WPF post per ulteriori informazioni, come riprodurlo e alcuni soluzioni alternative.

La mia domanda è: qualcun altro vi si è imbattuto? Se sì, come hai lavorato intorno ad esso?

A proposito, sembrano esserci molte situazioni in cui questa perdita non si verifica, e forse la domanda migliore è: quali sono esattamente le situazioni in cui si verifica questa perdita e non si verifica?

Per comodità qui è il codice che riproduce:

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

risposta

4

Microsoft ha confirmed che si tratta di un bug e che sia risolto in .NET 4.0.

Per quanto posso dire, questo bug si riproduce solo se l'oggetto che utilizza DynamicResource per fare riferimento a una risorsa a livello di applicazione ... non è mai incluso nell'albero visivo. Mi piacerebbe vedere alcune contro-prove a questo ... o ulteriori chiarimenti su quando si verificherà questa perdita.

Aggiornamento: Questo errore è stato corretto anche in .NET 3.5. Guarda questo caldo fix per maggiori informazioni.

Problemi correlati