Windows phone 7 从大枢轴导航后的内存清理。

Windows phone 7 从大枢轴导航后的内存清理。,windows-phone-7,navigation,mvvm-light,Windows Phone 7,Navigation,Mvvm Light,我有一个主细节轴。Pivot包含5个数据透视项,每个数据透视项都有十几个数据透视项。每个项目都有详细信息页面 现在我注意到它非常消耗内存。所以我在考虑减少内存使用的方法 我将数据透视项的加载移动到IndexChanged事件(所有数据透视项都从基本数据透视类继承,数据透视调用它们的OnPivotItemActivated(),所有初始化都在这里完成) 现在我正在考虑从内存上传所有PivotItem的内容,同时移动到详细信息页面。我该怎么做?只需将ItemsList设置为null 简单的回答是打

我有一个主细节轴。Pivot包含5个数据透视项,每个数据透视项都有十几个数据透视项。每个项目都有详细信息页面

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

  • 我将数据透视项的加载移动到IndexChanged事件(所有数据透视项都从基本数据透视类继承,数据透视调用它们的OnPivotItemActivated(),所有初始化都在这里完成)
  • 现在我正在考虑从内存上传所有PivotItem的内容,同时移动到详细信息页面。我该怎么做?只需将ItemsList设置为null

    • 简单的回答是打电话

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

      答案很长:

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

    • 它会停止应用程序中所有正在执行的线程
    • 它会检查应用程序中的每一个对象,看它是否被CPU引用或使用
    • 那些未使用的对象将从内存中删除,其余对象将被赋予新的内存地址,以便应用程序的内存位于单个连续块中
    • 因此,.Net将在需要时回收内存,因此您无需担心它

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

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

      我担心的是,通过事件保留对一些未使用对象的引用,比如在本例中:那么,主要问题是:如果ItemsList=null就足够了,或者我还应该遍历列表并将所有图像源设置为null?另外,我可能应该尝试仅在调试模式下调用GC.Collect(),看看会发生什么。如果问题是您通过事件获得了对对象的引用,那么GC.Collect将无法工作,因为您获得了对该对象的引用。当您丢弃对象时,您需要删除对事件的引用作为清理的一部分。但是是否有自动显示的引用?另外,删除所有事件订阅的最有效方法是什么?只是为了在活动中取消订阅?但如果这件事永远不会发生呢?