简体   繁体   English

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

[英]Usage of DynamicResource to an Application Level Resource Can Cause Leaks

It seems that using a DynamicResource to refer to an application level resource can cause memory leaks to occur.似乎使用 DynamicResource 来引用应用程序级资源会导致发生 memory 泄漏。

Please see this WPF forum post for more info, how to reproduce it, and some workarounds.请参阅此 WPF 论坛帖子以获取更多信息、如何重现它以及一些解决方法。

My question is: has anyone else run into it?我的问题是:还有其他人遇到过吗? If so, how have you worked around it?如果是这样,你是如何解决它的?

By the way, there seem to be many situations where this leak does not occur, and maybe the best question is: what exactly are the situations where this leak occurs and does not occur?顺便说一句,似乎有很多情况不会发生这种泄漏,也许最好的问题是:这种泄漏发生和不发生的情况到底是什么?

For convenience here is the code that reproduces it:为方便起见,这里是重现它的代码:

App.xaml 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 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 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第1页.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第1页.xaml.cs

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

    ~Page1()
    {
        Trace.TraceInformation("Page1 Finalized.");
    }
}

Microsoft has confirmed that this is a bug and that it is fixed in .NET 4.0. Microsoft 已确认这是一个错误,并且已在 .NET 4.0 中修复。

As far as I can tell, this bug only reproduces if the object that is using DynamicResource to refer to an application level resource... is never made part of the visual tree.据我所知,只有在使用 DynamicResource 来引用应用程序级资源的 object 从未成为可视化树的一部分时,才会重现此错误。 Would love to see some counter-evidence to that... or further clarification on when this leak does occur.希望看到一些相反的证据……或者进一步澄清这种泄漏何时发生。

Update: This bug has also been fixed in .NET 3.5.更新:此错误也已在 .NET 3.5 中修复。 See this hot fix for more info.有关详细信息,请参阅此修补程序

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM