用户控制孩子,发布太晚了

时间:2014-05-27 11:04:56

标签: c# wpf garbage-collection

使用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不会触发(可能是因为我只是删除它但应该发送特殊信号?),也不会在新页面加载的回调中激活。

0 个答案:

没有答案