我制作了一个Windows手机应用,但不幸的是其中存在一些内存泄漏,因为页面没有被正确地移除。这个问题已经通过使用以下答案解决:
Remove Pages windows phone 其中提到:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey
base.OnNavigatedTo(e);
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
});
});
这将从分析器中删除页面引用。但是导航后,内存仍然有所增加。而且增加的内存来源不明显。
因此,我尝试引入一个空白项目,并将其作为星型导航进行导航,如下所示:
这样可以删除多达20 mb的视觉和其他元素。因此,这是一个重大的进展。因此,我希望将功能拆分到不同的项目中,以消除不同功能之间的任何联系并保持低内存使用率。这最终形成以下结构:
- WebService
- MainProject
- SecondaryProject
- PortableLibrary
我使用可移植库在所有项目之间共享模型。 这影响了每次导航到新项目时,旧项目中的所有内容都会被清除,即每个项目只存在一个元素,这对于内存的改善很重要。但仍然存在一些内存泄漏,但受到限制,这意味着内存仅会增加到一定程度为止。 但是内存来自哪里? 回到分析器:
这表明页面没有被删除,所有元素 .view. 都将通过一个项目中的所有页面的配置代码进行删除。但是内存泄漏类似。
问题
- 如何从同一解决方案中的另一个项目中删除页面和元素?
- 如何从内存中删除项目?
两个项目之间没有共享的信息,除了它们都可以创建 LibraryOfModels
的版本。因此,在项目边界上没有事件、变量或引用被共享。 但是我无法将它从内存中删除。如果导航仅在一个项目中,则我的顶部代码片段可以将其从内存中删除。由于导航分布在两个项目上,所以问题存在。但在其他领域中,它具有一些内存优势,这就是为什么我想要这种结构的原因。
希望有人能帮忙。 谢谢!
附加测试
我尝试使所有页面成为用户控件,以避免导航。但是多次重新创建它们会产生1-2 Mb的稳定泄漏。因此,项目想法仍然是最佳的选择,因为存在界限。但仍无法将其移出。
仍然希望有得救的骑士;)
Singleton
来强制创建对象的唯一实例,对吗? 如果是这样,它对我没有帮助,因为每个实例只存在一个元素。如果导航仅在一个项目内,则我想要将它们从内存中删除,就像我顶部的代码片段所做的那样。问题存在于导航分布在两个项目上。但是它在其他领域具有一些内存优势,这就是为什么我想要这种结构的原因。 - JTIM