【问题标题】:GC blocks the UI thread in Silverlight applicationGC 阻塞 Silverlight 应用程序中的 UI 线程
【发布时间】:2012-06-26 07:00:31
【问题描述】:

我们正在使用 Silverlight 5 和 MVVM Light 开发 Silverlight 应用程序。视图中呈现了 3000 多个图形元素,每个元素都有一个关联的 ViewModel。 ItemsControl 用于将这些对象绑定到这些视图模型。第一次加载视图时,渲染 3000 个对象需要 7 秒。然而,当我们通过设置一个新的视图模型集合来刷新视图时,渲染需要 17 秒——即使我们这次只渲染较少数量的 ViewModel。这里关心的是不同渲染之间的 10 秒差异。

我们发现,当我们阻止 ViewModel 被 GC 清理时(通过将它们添加到另一个集合并且从不释放它们),随后的渲染时间也都只有 7 秒。所以由此得出的结论是,额外的 10 秒是由旧 ViewModel 的垃圾收集引起的。

从我们上面看到的情况来看,垃圾收集似乎阻塞了 UI 线程。 UI 被冻结,直到 GC 完成它的工作(我们认为这是我们在 VM Finalizer 方法中的临时日志记录完成后),然后 UI 将恢复渲染。

总而言之,我们的时间安排是:

初始 3000 个对象 - 约 7 秒。接下来替换为 500 个对象 - 约 17 秒。

初始 500 个对象 - 约 2 秒。接下来用 3000 个对象替换 - ~7 秒。

初始 3000 个对象 - 约 7 秒。接下来用 3000 个对象替换 - ~17 秒。

对于我们看到的这个非常奇怪的问题,有什么建议吗?

【问题讨论】:

  • 使用分析器查看额外时间的情况。
  • 是的,我建议使用分析器准确找出发生了什么,并首先确认 GC 是罪魁祸首。

标签: silverlight mvvm garbage-collection mvvm-light


【解决方案1】:

您可能需要手动调用垃圾收集器。它可能没有任何影响,但我建议调查您的代码并检查您是否可以将其放入代码中的某个巧妙位置,看看它是否对加载时间有任何影响。

Check this link for calling the GC manually.

【讨论】:

  • 如果您手动调用 GC,则说明您做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多