2009-03-09 4 views
5

Кажется, что использование DynamicResource для обращения к ресурсу уровня приложения может привести к утечкам памяти.Использование DynamicResource для ресурса уровня приложения может привести к утечкам

Для получения дополнительной информации см. Этот форум WPF post, а также некоторые обходные пути.

Мой вопрос: кто-нибудь еще сталкивается с этим? Если да, то как вы обходились вокруг?

Кстати, похоже, что существует много ситуаций, когда эта утечка не возникает, и, возможно, лучший вопрос: каковы именно ситуации, когда эта утечка происходит и не возникает?

Для удобства здесь есть код, который воспроизводит его:

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

ответ

4

Microsoft имеет confirmed, что это ошибка, и что она фиксируется в .NET 4.0.

Насколько я могу судить, эта ошибка воспроизводится только в том случае, если объект, использующий DynamicResource для ссылки на ресурс уровня приложения ... никогда не входит в визуальное дерево. Хотелось бы увидеть некоторые контр-доказательства этому ... или дать дополнительные разъяснения о том, когда эта утечка произойдет.

Обновление: Эта ошибка также устранена в .NET 3.5. См. Этот горячий fix для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^