1

我正在Silverlight 中为Windows Phone 7 开发一个应用程序。我陷入了Windows Phone 应用程序中非常常见的问题,但无法以任何方式摆脱它。这是从第一页到第二页、从第二页到第一页等多次导航时出现的内存泄漏问题。

为了解决这个问题,我创建了一个有 2 个空白页的新项目。每页有 2 个文本块用于打印当前内存和峰值内存,以及一个用于移动到下一页或上一页的按钮。当从第 1 页导航到第 2 页时,我对所有 3 件事进行空引用并调用 gc.collect 来销毁页面引用。同样,从第 2 页移到第 1 页时,我做同样的事情。

我还尝试每隔 500 毫秒在计时器中调用 gc.collect(),但仍然没有结果。如果我完全删除 gc.collect(),内存会增加 MB,所以我认为这是必须的。

4

1 回答 1

3

你这样做是错的。如果您不断地从第 1 页导航到第 2 页,然后再次导航到第 1 页,则您将所有以前的页面实例都保留在导航堆栈中。这对您指出的内存管理问题很不利,但这也是糟糕的用户体验,因为用户在退出应用程序之前必须多次按下后退按钮(实际上,我什至不确定它会过去通过市场认证)。

导航到第 2 页后,如果要转到第 1 页,则需要调用NavigationService.GoBack而不是NavigationService.Navigate. 它将恢复先前缓存的第 1 页实例(因此显然您不能取消该页面上的引用)。

在一些罕见的情况下,您可能真的想导航到 Page 1 的新实例而不是前一个实例。在这种情况下,调用NavigationService.RemoveBackEntry以从导航堆栈中删除最新的缓存页面(您可以多次调用以清除整个堆栈)。

于 2013-05-07T06:06:30.830 回答