警告:这是我第一个'真正'的WPF应用程序。我确定这是一个逻辑错误,我有一个地方,但无法弄清楚我应该在哪里寻找。WPF Window.Close内存泄漏
我有一个自助服务终端类型的应用程序,循环通过各种窗口,每个窗口显示不同类型的数据。我(目前)通过一个定时器来控制它们,并且应用程序运行良好,直到我最终达到内存不足异常。
我的代码通过Windows转动如下:
private Window activeWindow;
private void ShowNextTaskWindow(ITask task) {
Window nextWindow = windowManager.GetWindowForTask(task);
nextWindow.Show();
if (activeWindow != null) {
activeWindow.Close();
}
activeWindow = nextWindow;
}
的窗口管理类只实例化窗口的适当类型 - 即NewsWindow或视频窗口,根据任务类型:
public Window GetWindowForTask(ITask task) {
Window taskWindow = null;
switch (task.TaskType) {
case TaskType.Web:
taskWindow = new WebWindow(task as WebTask);
break;
case TaskType.Rss:
taskWindow = new RssWindow(task as RssTask);
break;
..... etc ......
}
return taskWindow;
}
每个窗口确实有(只有)一个事件处理在构造函数中添加的,就像这样:
Loaded += new RoutedEventHandler(Window_Loaded);
当然,有一个称为Window_Loaded的适当方法可以完成一些布局工作(设置窗口大小,控制大小等)。
我的问题是,应用程序只是继续消耗内存,直到它最终崩溃与内存不足异常 - 我似乎无法找出我失去了什么东西。
据我所知,调用Window.Close()应该摆脱窗口,所以我迷失在哪里寻找问题。
任何想法?
你确定不是泄漏内存的窗口中的控件之一吗?如果您使用空窗口运行应用程序,是否会发生内存不足异常? – 2011-04-25 19:35:23
你的窗口是否拥有非托管资源?考虑使用MVVM设计模式 - 您当前的体系结构不是非常WPF风格的。 – 2011-04-25 20:17:46
非常像这个http://stackoverflow.com/questions/2860965/wpf-memory-leak的答案,我发现一个案例,我确实有一个事件处理程序,用户没有正确处理。我已经修复了 - 但总体而言,仍然遭受同样的问题。如果我想知道*我正在“做错了”,那就去看MVVM吧。谢谢,@Danny Varod – reallyJim 2011-04-26 21:59:28