C# 在Windows 10中处理通用Windows应用程序中的内存

C# 在Windows 10中处理通用Windows应用程序中的内存,c#,win-universal-app,windows-10,windows-10-universal,windows-10-mobile,C#,Win Universal App,Windows 10,Windows 10 Universal,Windows 10 Mobile,我正在为Windows 10开发一个UWP应用程序。我的应用程序内存管理有问题。我有一个SplitView,它的内容将包含很多图像。当用户单击图像时,将在窗格中加载全尺寸图像。我直接在XAML中注册了很多点击事件。当我检查内存使用情况时,它会不断增加,一点之后,应用程序崩溃。我的问题是,我是否需要注销我在XAML中注册的所有事件以释放内存?我尝试调用GC.Collect(),但这并不能解决问题。我想可能是内存泄漏。应用程序中有多个页面,当用户选择SplitView外部可用的按钮时,内容会发生变化

我正在为Windows 10开发一个UWP应用程序。我的应用程序内存管理有问题。我有一个
SplitView
,它的内容将包含很多图像。当用户单击图像时,将在窗格中加载全尺寸图像。我直接在XAML中注册了很多点击事件。当我检查内存使用情况时,它会不断增加,一点之后,应用程序崩溃。我的问题是,我是否需要注销我在XAML中注册的所有事件以释放内存?我尝试调用
GC.Collect()
,但这并不能解决问题。我想可能是内存泄漏。应用程序中有多个页面,当用户选择
SplitView
外部可用的按钮时,内容会发生变化,在使SplitView内容具有另一个页面之前,我如何注销在该特定页面中注册的事件

编辑:

整个页面的XAML超过300行,因此我无法将其粘贴到这里。但是事件是这样记录的

<Button Name="Sample" Tapped="Sample_Tapped" Content="Sample Button" />
当用户更改节时,我调用垃圾收集器

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        GC.Collect();

    }

但是没有释放内存。

我认为这一行导致了问题:

MainFrame.Navigate(typeof(ImagePage),“SampleSection”)

每次用户选择图像时,您都将保持创建新页面。它会随着时间的推移消耗掉内存

解决方案是使用新数据刷新页面(new DataContext?),而不是创建新数据。另一个解决方案是在需要使用属性创建新页面时清除大型机的导航堆栈


在XAML中将
NavigationCacheMode
设置为'Required'也会有所帮助,但这不是问题的根源。

我认为这一行导致了问题:

MainFrame.Navigate(typeof(ImagePage),“SampleSection”)

每次用户选择图像时,您都将保持创建新页面。它会随着时间的推移消耗掉内存

解决方案是使用新数据刷新页面(new DataContext?),而不是创建新数据。另一个解决方案是在需要使用属性创建新页面时清除大型机的导航堆栈


在XAML中将
NavigationCacheMode
设置为“必需”也会有所帮助,但这不是问题的根源。

需要更多信息。你如何登记参加这些活动?是否每次访问时都会重新创建页面?即使用户停留在页面上而不重新加载页面,是否也会发生泄漏?我已经添加了更多信息。请理解,我不能粘贴整个代码。太长了。我不知道为什么垃圾收集不起作用。你知道有叫做内存分析器的工具吗?使用其中一个。例如,Ants内存分析器是最容易使用的工具之一。PerfView是一个免费的分析器,顺便说一句,它是最好的,但是它有很高的学习曲线。我很抱歉。我一个都没用过。我对发展一无所知,甚至不知道它们的存在。我会查的。网页本身订阅了任何活动吗?像是信息巴士什么的?调用GC.Collect()是毫无意义的,它对您没有帮助,无需尝试。我也支持@AloisKraus的评论。问题似乎并不明显,您需要一个内存分析器。需要更多信息。你如何登记参加这些活动?是否每次访问时都会重新创建页面?即使用户停留在页面上而不重新加载页面,是否也会发生泄漏?我已经添加了更多信息。请理解,我不能粘贴整个代码。太长了。我不知道为什么垃圾收集不起作用。你知道有叫做内存分析器的工具吗?使用其中一个。例如,Ants内存分析器是最容易使用的工具之一。PerfView是一个免费的分析器,顺便说一句,它是最好的,但是它有很高的学习曲线。我很抱歉。我一个都没用过。我对发展一无所知,甚至不知道它们的存在。我会查的。网页本身订阅了任何活动吗?像是信息巴士什么的?调用GC.Collect()是毫无意义的,它对您没有帮助,无需尝试。我也支持@AloisKraus的评论。问题似乎并不明显,你需要一个内存分析器。我明白你的意思。如果我错了,请纠正我,但是每次创建新页面时,旧页面内存应该回收,对吗?它没有发生。它不应该是清晰的,因为如果您实际上没有,您将需要它返回事件。返回堆栈肯定不是无止境的,因此它不应该导致内存不足异常。值得一试,也许这一页很重。我明白你的意思。如果我错了,请纠正我,但是每次创建新页面时,旧页面内存应该回收,对吗?它没有发生。它不应该是清晰的,因为如果您实际上没有,您将需要它返回事件。返回堆栈肯定不是无止境的,因此它不应该导致内存不足异常。值得一试,尽管这一页可能很重。
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        GC.Collect();

    }