【问题标题】:Why does a WPF UserControl with a binding not get Garbage Collected?为什么带有绑定的 WPF UserControl 不会收集垃圾?
【发布时间】:2011-03-31 20:57:30
【问题描述】:

我们的应用程序在其主窗口中添加和删除 WPF (4.0) UserControls,我们注意到它们没有收集垃圾(通过永不返回 null 的 WeakReferences)。似乎如果 UserControl 具有绑定,则会发生这种情况,即使该控件从未添加到树中。 控制台应用程序中最简单的复制如下:

主程序

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var obj = GetObj();
        var ctl = GetCtl();
        for (int x = 0; x < 4; x++)
        {
            GC.Collect();
            Thread.Sleep(1000);
        }
        bool objAlive = obj.IsAlive;
        bool ctlAlive = ctl.IsAlive;
        Console.WriteLine(objAlive + "-" + ctlAlive);
        Console.ReadLine();
    }

    private static WeakReference GetObj()
    {
        return new WeakReference(new object());
    }

    private static WeakReference GetCtl()
    {
        return new WeakReference(new MyCtl());
    }
}

MyCtl 用户控件(后面的代码是标准的,没有被修改过

<UserControl <!--Snip Default Namespaces-->>
    <TextBlock Text="{Binding Blah}" />
</UserControl>

objAlive 为假,但 ctlAlive 为真。如果从 UserControl XAML 中删除 Binding,则两者均为 false。如果我连接了一个内存分析器,MyCtl 仍然存在,但我不知道是什么在引用它(感谢有关如何使用 jetBrains 找到它的提示)。

这是预期的行为还是我需要做更多的工作来清理我的 WPF 用户控件?

【问题讨论】:

    标签: wpf memory-leaks garbage-collection


    【解决方案1】:

    取决于您要绑定的内容。

    这可能是一个已知问题:http://support.microsoft.com/kb/938416

    您是否绑定到自定义类?您是否实现了 INotifyPropertyChanged 或创建了 DependencyProperty?

    【讨论】:

    • 这很可能,我们已经实现了 INotifyPropertyChanged。
    • 上面的链接好像坏了,有谁知道我在哪里可以挖掘到这个?
    • 简而言之,您需要使用 INotifyPropertyChanged 或 DependencyProperty,否则您可能会因框架使用 PropertyDescriptors 进行绑定而导致内存泄漏。 PropertyDescriptors 创建的强对象引用可以阻止对象被垃圾回收销毁。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2010-12-19
    • 2014-08-08
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多