0

我们正在使用 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 秒。

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

4

1 回答 1

0

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

检查此链接以手动调用 GC。

于 2012-06-25T01:44:24.493 回答