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