有没有人知道如何使用ChildWindow解决SL3中的内存泄漏?
请参阅下面的代码段:
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = new ChildWindow();
window.Closed += new EventHandler(window_Closed);
window.Show();
}
void window_Closed(object sender, EventArgs e)
{
((ChildWindow)sender).Closed -= new EventHandler(window_Closed);
WeakReference reference = new WeakReference(sender);
GC.Collect();
GC.WaitForPendingFinalizers();
bool isControlAlive = a.IsAlive;
}
它始终显示为“活着” - 当我在任务管理器中监视iexplore实例时 - 每次打开和关闭子窗口时内存都会继续增加。
请帮忙。
感谢。
克里斯
答案 0 :(得分:4)
据我所知,还没有正式修复。 This page描述了内存泄漏的本质:
... [ChildWindow]多次订阅RootVisual_GotFocus,但它只在关闭期间取消订阅一次。 这会导致ChildWindow永久保留在附加到RootVisual的GotFocus事件的内存中。
根据评论部分,您可以按如下方式修改Silverlight Toolkit代码以解决问题:
修改ChildWindow.cs上的ChildWindow_LostFocus函数(第731行),在再次添加之前减去RootVisual_GotFocus侦听器:
Application.Current.RootVisual.GotFocus -= this.RootVisual_GotFocus;
Application.Current.RootVisual.GotFocus += this.RootVisual_GotFocus;