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