Привязка к кисти вызывает утечку памяти? - PullRequest
2 голосов
/ 23 ноября 2010

Допустим, в моем приложении есть следующие классы.

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public SolidColorBrush Brush { get; set; } 

    public MainWindow()
    {
        InitializeComponent();
        Brush = new SolidColorBrush(Colors.AliceBlue);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window1 window = new Window1();
        window.DataContext = this;
        window.ShowDialog();
        Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)delegate
                                                                           {
                                                                               GC.Collect();
                                                                               GC.WaitForPendingFinalizers();
                                                                               GC.Collect();
                                                                           });
    }

MainWindow.xaml

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Button Click="Button_Click">Do It</Button>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    ~Window1()
    {
        Debug.WriteLine("Window1 Finalized");
    }
}

Window1.xaml

<Window x:Class="WpfApplication8.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"
        Background="{Binding Brush}">
    <Grid>

    </Grid>
</Window>

Когда я запускаю приложение, нажимаю кнопку Do It и закрываю открытое окно - Debug.WriteLine("Window1 Finalized"); не выполняется. Это означает, что объект Window1 все еще находится в памяти, а не в GCed. Но если я уберу привязку кисти из Window1.xaml - строка «Window1 Finalized» появится в выводе Это означает, что объект Window1 является GCed.

Как привязка хранит объект в памяти? Это ошибка или способ привязки реализован?

Редактировать 1

Если я связываю свойство Foreground вместо свойства Background, Window1 завершается. Похоже, это не системный эффект зависимости, а эффект реализации свойства Background.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Окно1 не завершено, поскольку на него все еще есть ссылки из синтаксиса Binding в его свойстве BackGround.

Хотя Binding является OneWay, тот факт, что существует привязка к свойству MainWindow, означает, что существует ссылка на Window1 из Mainwindow (из-за способа работы системы зависимостей) - поэтому Window1 не является кандидатом на сборку мусора. Коллекция (и, следовательно, не будет завершена)

0 голосов
/ 22 октября 2013

У меня была похожая проблема.Вызов метода замораживания кисти после создания разрешил ее.

...