使用WPF IM不太高兴框架和页面如何导航和使用内存(例如无法删除导航前向堆栈)所以我决定使用UserControls而不是Pages和自定义UserControl来跟踪新路线(将内容设置为当前“页面”)。
但是我仍然遇到了一个非常严重的问题:如果我更换内容,之前的“页面”的内存将在2次替换后被释放。
这是我非常简化的LightNavigationControl(请注意,还没有真正的导航功能),它只是在this.Content上显示“page”元素并强制调用GC以希望释放替换的。
public partial class LightNavigationControl : UserControl
{
public LightNavigationControl()
{
InitializeComponent();
}
public void ClearContent()
{
this.Content = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
public void PutContent()
{
this.Content = new CustomPages.MemoryTestPage();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
这是我正在使用的“页面”的示例:
public partial class MemoryTestPage : UserControl
{
public byte[] myMemory = new byte[50*1024*1024]; //allocate 50MB
public MemoryTestPage()
{
InitializeComponent();
}
}
当我调用Put / Clear Content元素时会发生这种情况,例如:
Action | Memory
_________________________
PutContent | 50MB
PutContent | 100MB
PutContent | 100MB
PutContent | 100MB
ClearContent | 50MB
ClearContent | 0MB
删除GC调用会影响内存,它会持续增长到4-5,然后有时会下降到50 MB ......但这是非常不规则的。有什么建议吗?
谢谢!
编辑1
似乎原因可能是GC过早发射,所以旧的“页面”尚未被引用。在page_unloaded上调用GC不会触发(可能是因为我只是删除它但应该发送特殊信号?),也不会在新页面加载的回调中激活。