4

我希望能够在 C# 项目中创建数百个 winrt 控件(搜索结果控件)实例。问题是这样做需要很长时间(十分之一秒或更糟),并且必须在 UI 线程上完成,从而造成显示结果的停顿和延迟。

现在我已经通过在启动期间预缓存许多控件实例来绕过这个问题。这种方法有效,但会影响启动时间(分析显示接近启动的处理器时间的 40% 用于缓存这些控件)并创建要管理的细节,例如缓存的大小。

我认为问题在于,每次实例化控件时,冗余工作(例如重新解析 XAML)都是由底层框架完成的。也许有办法避免重复这项工作?也许我可以廉价地克隆现有控件?有人有想法吗?

4

2 回答 2

1
  • 您可以在并行线程中进行预缓存。对多核处理器的启动时间影响较小

  • searchresult.memberwiseclone 会给你浅拷贝。可能会更快,不确定

  • 您可以只使用一个搜索结果并在使用前用正确的数据填充它吗?在这种情况下,不需要创建很多。只需使用一个作为可重复使用的容器。

  • 如果在将控件添加到您可以使用的父表单时花费时间

    • 暂停布局/恢复布局(这是win32)
    • 完成后将父级设置为不可见并返回可见
  • 有没有另一种方法可以更快地做同样的事情?(竞争控制、3d 派对等)

于 2012-08-20T11:55:38.733 回答
1

前注:已经有一段时间了,所以微软现在可能已经修复了 win8 应用程序 UI 虚拟化。我没有检查。

我当时最终所做的只是将我自己的 UI 虚拟化组合在一起来解决这个问题。基本上:缓存控件并重新使用它们来显示可查看的数据(使用二叉搜索树来有效地查询可以看到的内容)。我写了一篇关于它的博客文章

于 2013-12-18T18:06:02.230 回答