【发布时间】:2011-08-12 12:52:26
【问题描述】:
警告:这是我的第一个“真正的”WPF 应用程序。我确定这是我在某个地方遇到的逻辑错误,但不知道我应该在哪里寻找。
我有一个自助服务终端类型的应用程序,它在各种窗口中循环,每个窗口显示不同类型的数据。我(目前)通过计时器控制这些,并且应用程序运行良好,直到我最终遇到内存不足异常。
我在窗口中旋转的代码如下:
private Window activeWindow;
private void ShowNextTaskWindow(ITask task) {
Window nextWindow = windowManager.GetWindowForTask(task);
nextWindow.Show();
if (activeWindow != null) {
activeWindow.Close();
}
activeWindow = nextWindow;
}
windowManager 类仅根据任务类型实例化适当类型的窗口——即 NewsWindow 或 VideoWindow:
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() 应该摆脱窗口,所以我不知道该去哪里寻找问题。
有什么想法吗?
【问题讨论】:
-
您确定不是窗口中泄漏内存的控件之一吗?如果您使用空窗口运行应用程序,是否会发生 Out Of Memory 异常?
-
您的窗口是否包含非托管资源?考虑使用 MVVM 设计模式 - 您当前的架构不是 WPF 风格的。
-
很像对stackoverflow.com/questions/2860965/wpf-memory-leak 的回答,我发现了一个案例,其中我确实有一个未正确处理的订阅者事件处理程序。我已经解决了这个问题——但总的来说,仍然遇到同样的问题。将研究 MVVM,因为我知道我“做错了”。谢谢,@Danny Varod
-
已修复。有一个事件处理程序没有被删除。无论如何,现在完全抛弃并用 MVVM 编写。
标签: .net wpf memory-leaks