【问题标题】:Memory cleaning after navigation from large pivot.从大支点导航后的内存清理。
【发布时间】:2013-07-01 14:18:08
【问题描述】:

我有一个主细节支点。 Pivot 包含 5 个 PivotItems,每个 PivotItems 都有十几个项目。每个项目都有详细信息页面。

现在我注意到它非常消耗内存。所以我正在考虑减少内存使用的方法。

  • 我将 PivotItems 的加载移至 IndexChanged 事件(所有数据透视项都继承自基数据透视类,并且 Pivot 调用它们的 OnPivotItemActivated(),所有初始化都在此处完成)。
  • 现在我正在考虑从内存中上传所有 PivotItem 的内容,同时转到详细信息页面。我怎样才能做到这一点?只需将 ItemsList 设置为 null?

【问题讨论】:

    标签: windows-phone-7 navigation mvvm-light


    【解决方案1】:

    简短的回答是打电话

    GC.Collect()
    

    这将调用垃圾收集器并从内存中清除所有未使用的对象。这也是一个坏主意。

    长答案:

    .Net 是一个托管内存环境。这意味着它会在需要更多内存时自动回收内存。 .Net 通过运行其垃圾收集器来回收内存。下面是垃圾收集器的作用:

    1. 它会停止应用程序中每个正在执行的线程
    2. 它会检查应用中的每个对象,以查看它是否被 CPU 引用或使用。
    3. 从内存中删除那些未使用的对象,并为剩余的对象分配新的内存地址,以便您的应用程序内存处于单个连续块中。

    因此,.Net 会在需要时回收内存,因此您无需担心。

    如果您真的想手动执行此操作,请在用户希望应用暂停的位置执行此操作,例如:

    • 保存数据
    • 从屏幕 X 移动到屏幕 Y

    【讨论】:

    • 我担心的事情 - 是通过事件保持对一些未使用对象的引用,例如在这种情况下:blogs.windows.com/windows_phone/b/wpdev/archive/2012/02/01/… 所以,主要问题是:如果 ItemsList = null 将是够了,还是我也应该遍历列表并将所有图像源设置为空?另外,我可能应该尝试仅在调试模式下调用 GC.Collect(),看看会发生什么。
    • 如果问题是您通过事件获得了对象的引用,那么 GC.Collect 将不起作用,因为您已经获得了对该对象的引用。当您丢弃对象时,您需要在清理过程中删除对事件的引用。
    • 但是有没有自动出现的参考资料?另外,删除所有事件订阅的最有效方法是什么?只是在活动内部取消订阅?但如果事件永远不会发生呢?
    猜你喜欢
    • 2014-10-26
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多