4
我們的應用程序添加並從它的主窗口中刪除WPF(4.0)UserControls,並且我們注意到它們沒有收到垃圾收集(通過永不返回null的WeakReferences)。看起來,如果UserControl有發生綁定,即使該控件從未添加到樹中。在一個控制檯應用程序最簡單重現如下:爲什麼帶有綁定的WPF 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中刪除綁定,兩者都是假的。如果我連接上emory profiler,MyCtl仍然懸而未決,但我無法弄清楚引用它是什麼(提示如何使用jetBrains找到它)。
這是預期的行爲,還是我需要做更多來清理我的WPF UserControl?
這似乎很可能,我們已經實現了INotifyPropertyChanged。 – 2011-02-03 04:14:58