我需要为kiosk终端编写一个应用程序,我为此选择WPF,因为我需要单个窗口应用程序。实现很简单 - NavigationWindow和一组Pages,用于NavigationService.Navigate()方法。
在使用应用程序期间,我看到它冻结,消耗大量内存。我发现当导航内容时,NavigationService会将导航记录为导航历史记录中的条目。我开始使用NavigationService.RemoveBackEntry()方法清理历史记录。
是 - 清除历史记录,但页面的终结器不会调用。页面仍在内存中,并且仅在应用程序关闭时才会调用finallizers。我可以从一个页面转到另一个页面然后再返回几次 - 应用程序将消耗大约150-200 Mb(从5-6 Mb开始)。
我用内存分析器检查了应用程序,发现使用的内存没有增加 - 大约5-8 Mb,但是工作集消耗大量内存。
所以我找到了一种清除工作集的方法,但我并没有想到这是一种错误的方法。解决方案必须更容易。
文档说导航服务不会在导航历史记录中存储内容对象的实例。相反,NavigationService每次使用导航历史记录导航时都会创建内容对象的新实例。此行为旨在避免过多的内存消耗。但正如我所看到的那样,这种方式不起作用。
我以为这种行为只有当NavigationService使用URI进行导航时才会起作用(我称之为Navigate(新的MyPage())进行导航),但即使使用URI也不起作用 - 即使我仍然在内存中的页面实例仍然存在清除历史期刊。
以下是问题:
1)其他人遇到过类似的问题吗?
2)使用NavigationWindow构建单窗口应用程序是否正确且最佳?