【问题标题】:Silverlight 4 memory leak with ItemsControl带有 ItemsControl 的 Silverlight 4 内存泄漏
【发布时间】:2010-08-20 09:30:35
【问题描述】:

在我们基于 Caliburn.Micro 构建的 SL4 应用程序中,我们遇到了(另一个)内存泄漏。

剥离出来,问题似乎是由 ItemsControl 引起的,其中自定义 DataTemplate 绑定到实现 INotifyPropertyChanged 接口的对象的 IEnumerable 集合。

当源集合改变时(另一个集合被分配给 ItemsControl 的 ItemsSource 绑定到的 ViewModel 的属性),原始集合中的实体和绑定的 DataTemplates 不会被垃圾回收。虽然 NotifyPropertyChanged 的​​事件处理似乎是通过 WeakReference 在内部完成的,但就像 SL 保留对这些对象的另一个引用一样。所以每次我们从服务器刷新数据时,内存消耗都会增加。

你知道如何解决这个问题吗? 我实在想不通SL4怎么会出现这种bug!

一些实验表明调用 ItemsControl.Items.Clear() 可能会有所帮助。任何提示如何在每次更改 ItemsSource 时简单地调用它?我唯一想到的就是重写 ItemsSourceProperty 并在那里添加一个处理程序。

编辑: 原来泄漏发生在这种情况下:

  • 通过 RIA 服务上下文加载实体并将它们的集合存储在 viewmodel 的属性中
  • 将带有自定义数据模板的列表视图绑定到带有实体集合的属性
  • 通过 RIA 服务上下文刷新实体

发生的情况是,尽管在视图中可以看到实体被刷新,但内存消耗正在上升。

如果没有绑定,刷新实体不会消耗更多内存(它可能会但内存消耗水平最终会在 GC 完成其工作时返回)。

如果你清除上下文或者只是创建一个新的,内存最终也会被收集。

问题似乎与 RIA 服务有关。

如果您愿意,我可以提供一个显示问题的简单项目。

更新:内存泄漏似乎是由 INotifyDataErrorInfo 引起的。阅读here

【问题讨论】:

  • 感谢您提醒我这个问题!你知道它是否发生在 WPF 中吗?
  • 还没有。但是我会尝试为 WPF 和 SL 准备简单的演示来重现问题,所以我们会看到。你有同样的问题吗?到目前为止,似乎即使是 RIA 也可能会以某种方式影响问题......
  • 只是为了确认一下:您是在没有附加调试器的情况下在发布模式下测试的,对吧?
  • @Kent 没关系。发布或调试模式,无论是否附加调试器,泄漏仍然存在。

标签: silverlight memory-leaks itemscontrol


【解决方案1】:

更新:

用于修复内存泄漏的 Silverlight 4 服务版本: http://timheuer.com/blog/archive/2010/09/01/silverlight-service-release-september-2010-gdr1.aspx

Silverlight 4 已知数据模板存在内存泄漏问题。目前正在测试它的方式有一个修复。

这是我一直关注的一个帖子:

用户“heuertk”是 Microsoft Silverlight 开发人员......他解释了问题和修复状态......

http://forums.silverlight.net/forums/t/171739.aspx

【讨论】:

    【解决方案2】:

    据我了解,这个特定问题是 Silverlight 4 本身的一个错误。但是,您说您遇到了另一个内存泄漏。你确定那个是否与 Caliburn.Micro 有关,如果是,你是否在项目论坛上发布过相关信息?如果故障出在 CM 中,我想尝试修复它。谢谢。

    【讨论】:

    • 嗨,罗伯。嗯,虽然不是最新发布的 GDR1 解决的众所周知的 SL4 错误,但似乎与 RIA 服务有关。请参阅更新的问题。无论如何,非常感谢 Caliburn-Micro - 它真的很棒!如果泄漏是由 CM 引起的,我会先尝试自己修复,然后将修复发送给您 :-)。
    • 嗨,罗伯。我们最终追踪到了内存泄漏——它不是由 C.Micro 引起的,而是由 SL 本身引起的 (INotifyDataErrorInfo)。我在博客上写过:baud.cz/blog/…
    【解决方案3】:

    嘿,我在玩你的解决方案,我想出了这个很好的解决方法,基本上你将 DataSrc 类更改为以下,唯一的问题是如何在 Ria Services 实体上应用类似的东西.我已经在使用 T4 来调整代码生成(对于小事),但我不确定我是否可以在两者之间强制执行类似的操作。另外,我想问一下,您是否报告了您的示例应用程序的问题?额外的报告永远不会受到伤害:)

        public class DataSrc  :INotifyDataErrorInfo
    {
        public string Name { get; set; }
    
        public IEnumerable GetErrors(string propertyName)
        {
            yield break;
        }
    
        public void InvokeEvent()
        {
            _weakLinkErrorChanged.OnEvent(this, new DataErrorsChangedEventArgs("Name"));
        }
    
        private WeakLinkErrorChanged<DataSrc, object> _weakLinkErrorChanged;
    
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged
        {
            add 
            { 
                 _weakLinkErrorChanged=new WeakLinkErrorChanged<DataSrc, object>(this);
                _weakLinkErrorChanged.ErrorsChanged += value;
            }
    
            remove { _weakLinkErrorChanged.ErrorsChanged -= value; }
        }
    
        public bool HasErrors
        {
            get { return false; }
        }
    }
    
    
    internal class WeakLinkErrorChanged<TInstance, TSource> where TInstance : class
    {
    
        private readonly WeakReference _weakInstance;
    
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    
        public WeakLinkErrorChanged(TInstance instance)
        {
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
    
            _weakInstance = new WeakReference(instance);
        }
    
        public void OnEvent(TSource source, DataErrorsChangedEventArgs eventArgs)
        {
            var target = _weakInstance.Target as TInstance;
    
            if (target != null)
            {
                if(ErrorsChanged!=null)
                    ErrorsChanged(target, eventArgs);
            }
            else
                ErrorsChanged = null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多