Использование DynamicResource для ресурса уровня приложения может вызвать утечки - PullRequest
5 голосов
/ 10 марта 2009

Кажется, что использование 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>

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 Ответ

4 голосов
/ 24 марта 2009

У Microsoft подтверждено , что это ошибка и что она исправлена ​​в .NET 4.0.

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

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

...