将DynamicResource用于应用程序级资源可能会导致泄漏

时间:2009-03-09 23:07:05

标签: wpf memory-leaks resources

似乎使用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.");
    }
}

1 个答案:

答案 0 :(得分:4)

Microsoft已confirmed这是一个错误,并且已在.NET 4.0中修复。

据我所知,如果使用DynamicResource引用应用程序级资源的对象永远不会成为可视树的一部分,则此错误仅会再现。希望看到一些反证据......或者进一步澄清这种泄漏何时发生。

更新:此错误也已在.NET 3.5中修复。有关详细信息,请参阅此热门fix