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

cpl*_*tts 5 wpf resources memory-leaks

似乎使用DynamicResource来引用应用程序级资源可能会导致内存泄漏.

有关更多信息,如何重现它以及一些解决方法,请参阅此WPF论坛帖子.

我的问题是:还有其他人遇到过吗?如果是这样,你是如何解决它的?

顺便说一句,似乎有很多情况下没有发生这种泄漏,也许最好的问题是:这种泄漏发生和不发生的情况究竟是什么?

为方便起见,这里是重现它的代码:

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

Page1.xaml.cs

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

    ~Page1()
    {
        Trace.TraceInformation("Page1 Finalized.");
    }
}
Run Code Online (Sandbox Code Playgroud)

cpl*_*tts 4

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

据我所知,只有当使用 DynamicResource 引用应用程序级资源的对象从未成为可视化树的一部分时,才会重现此错误。希望看到一些反证据……或者进一步澄清泄漏何时确实发生。

更新:这个错误也在.NET 3.5中得到修复。请参阅此修补程序以获取更多信息。