4

我需要为 kiosk 终端编写一个应用程序,为此我选择 WPF,因为我需要单窗口应用程序。实现很简单 - NavigationWindow 和一组 Pages,在 NavigationService.Navigate() 方法中使用。

在使用该应用程序的过程中,我看到它冻结,消耗大量内存。我发现当内容被导航到时,NavigationService 将导航记录为导航历史中的一个条目。我开始使用 NavigationService.RemoveBackEntry() 方法清理历史记录。

是的 - 历史被清除,但页面的终结器不会调用。页面仍在内存中,并且仅在应用程序关闭时才调用终结器。我可以从一个页面转到另一个页面,然后返回几次 - 应用程序将消耗大约 150-200 Mb(从 5-6 Mb 开始)。

我用内存分析器检查了应用程序,发现使用的内存没有增加 - 它大约 5-8 Mb,但工作集消耗大量内存。

所以我找到了一种清除工作集的方法,但我并没有想到这是一种错误的方法。解决方案必须更容易。

文档说 NavigationService 不会在导航历史记录中存储内容对象的实例。相反,NavigationService 会在每次使用导航历史导航到内容对象时创建一个新实例。此行为旨在避免过多的内存消耗。但正如我所见,它不是这样工作的。

我认为这种行为仅在 NavigationService 使用 URI 进行导航时有效(我调用 Navigate(new MyPage()) 进行导航),但即使使用 URI 也不起作用 - 即使我清除历史记录,页面实例仍在内存中杂志。

所以这里是问题:

1)其他人也遇到过类似的问题吗?

2) 这是使用 NavigationWindow 构建单窗口应用程序的正确和最佳方式吗?

4

0 回答 0