Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我设置WPF子窗口的所有者属性时,我是否阻止它被垃圾收集?_C#_Wpf_Garbage Collection - Fatal编程技术网

C# 当我设置WPF子窗口的所有者属性时,我是否阻止它被垃圾收集?

C# 当我设置WPF子窗口的所有者属性时,我是否阻止它被垃圾收集?,c#,wpf,garbage-collection,C#,Wpf,Garbage Collection,如果父窗口A(通过构造函数)将对自身的引用传递给子窗口B,以便B可以将其所有者属性设置为A,这是否意味着子窗口B不会被垃圾收集,因为父窗口A在应用程序期间保持活动状态 如果是这种情况,那么在WPF窗口之间创建干净的父/子关系的最佳方法是什么?这种关系是否有弱引用的概念 更新:大脑故障。好吧,我不该在下午这么晚的时候问这个问题。我把问题复杂化了。我的大脑颠倒了GC的逻辑,认为孩子无法收集,因为它引用了其他完全错误的东西。感谢所有回答的人。只要堆栈中不存在对对象的引用,对象就有资格进行垃圾收集。因此

如果父窗口A(通过构造函数)将对自身的引用传递给子窗口B,以便B可以将其所有者属性设置为A,这是否意味着子窗口B不会被垃圾收集,因为父窗口A在应用程序期间保持活动状态

如果是这种情况,那么在WPF窗口之间创建干净的父/子关系的最佳方法是什么?这种关系是否有弱引用的概念


更新:大脑故障。好吧,我不该在下午这么晚的时候问这个问题。我把问题复杂化了。我的大脑颠倒了GC的逻辑,认为孩子无法收集,因为它引用了其他完全错误的东西。感谢所有回答的人。

只要堆栈中不存在对对象的引用,对象就有资格进行垃圾收集。因此,只要您在
窗口a
中保留对
窗口B
的引用,它就永远不会被垃圾收集


为了使其符合GC的条件,您必须将对它的任何引用显式设置为null或另一个对象引用。

我创建了您提到的窗口,并添加了一些代码:

// 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");
    }
//窗口A中的XAML
橱窗
垃圾收集
//窗口A中的代码
私有无效按钮\u单击(对象发送者,路由目标e)
{
WindowB WindowB=新的WindowB(此);
windowB.Show();
}
私有无效按钮\u单击\u 1(对象发送者,路由目标)
{
GC.Collect();
}
//WindowB中的代码
公共窗口B(窗口A窗口A)
{
this.Owner=windowA;
初始化组件();
}
~WindowB()
{
控制台。WriteLine(“在一阵烟雾中上升”);
}
一旦B关闭并按下第二个按钮,析构函数就会运行。希望这能回答这个问题

如果父窗口A将对自身的引用传递给子窗口B(通过 构造函数),以便B可以将其所有者属性设置为A,这意味着什么 子窗口B不会被垃圾收集,因为父窗口A 在应用程序期间保持活动状态

正确,子窗口B在父窗口A存在之前一直存在,因为父窗口与窗口B之间存在一个活动引用

如果是这样的话,那么创建清洁环境的最佳方法是什么 WPF窗口之间的父/子关系?有什么概念吗 这种关系的弱引用

当窗口B关闭时,清除父窗口对窗口B的引用。这样,就没有对WindowB的实时引用,可以对其进行垃圾收集

parentWindow.WindowB = null;

还有一件事,在所有一次性对象超出范围之前调用Dispose方法是一种很好的做法。您可以对本地/一次性对象使用
using
语句。

当您关闭并完成子窗口B时,请确保Owner属性设置为null。参考将被断开连接,最终应该被gced。我喜欢这个答案胜过其他答案。