Когда я устанавливаю свойство Owner дочернего окна WPF, я запрещаю собирать мусор? - PullRequest
2 голосов
/ 06 октября 2011

Если родительское окно A передает ссылку на себя в дочернее окно B (через конструктор), так что B может установить для своего свойства Owner значение A, означает ли это, что дочернее окно B не будет собирать мусор, потому что родительское окно A остается активным для продолжительность применения?

Если это так, каков наилучший подход для создания чистых родительских / дочерних отношений между окнами WPF? Существует ли концепция слабых ссылок для этого типа отношений?

ОБНОВЛЕНИЕ: Brain FAIL. Хорошо, я не должен был задавать этот вопрос так поздно днем. Я чрезмерно усложнял проблему. Мой мозг изменил логику GC и думал, что ребенок не может собрать, потому что он ссылается на что-то еще, что является полностью ложным. Спасибо всем, кто все равно ответил.

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Я создал упомянутую вами Windows и добавил некоторый код:

// XAML in Window A

<StackPanel>
    <Button Click="Button_Click">Show Window</Button>
    <Button Click="Button_Click_1">Garbage Collect</Button>
</StackPanel>

// Code in Window A
 private void Button_Click(object sender, RoutedEventArgs e)
        {
            WindowB windowB = new WindowB(this);
            windowB.Show();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            GC.Collect();
        }

    // Code in WindowB
    public WindowB(WindowA windowA)
    {
        this.Owner = windowA;
        InitializeComponent();
    }

    ~WindowB()
    {
        Console.WriteLine("Gone up in a puff of smoke");
    }

После закрытия B и нажатия второй кнопки запускался деструктор.Надеюсь, это ответит на вопрос.

1 голос
/ 06 октября 2011

Если родительское окно A передает ссылку на себя в дочернее окно B (через конструктор), так что B может установить свое свойство Owner в A, значит ли это, что дочернее окно B не будет собирать мусор, потому что родительское окно Aостается активным в течение всего срока действия приложения?

Правильно, дочернее окно B живет до тех пор, пока живет родительское окно A, поскольку существует прямая ссылка из родительского окна в WindowB.

Если это так, каков наилучший подход для создания чистых родительских / дочерних отношений между окнами WPF?Существует ли концепция слабых ссылок для этого типа отношений?

Очистить ссылку Родительского окна на Окно B при закрытии WindowB.Таким образом, нет прямой ссылки на WindowB, и она может собираться мусором.

parentWindow.WindowB = null;

Еще одна вещь, это хорошая практика - вызывать метод Dispose для всех объектов Disposable, прежде чем они выйдут из области видимости.Вы можете использовать оператор using для локальных / одноразовых объектов.

1 голос
/ 06 октября 2011

Объекты пригодны для сборки мусора, как только в стеке нет ссылок на них.По этой причине, пока вы удерживаете ссылку на window B в пределах window A, она никогда не будет собирать мусор.

Для того, чтобы получить право на сборщик мусора, вам придется явно установить любую ссылку наэто нуль или ссылка на другой объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...