有效地创建了winrt地铁控制的许多实例

时间:2012-08-15 19:42:38

标签: c# .net performance xaml microsoft-metro

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 如果将控件添加到父表单时花费了时间,则可以使用

    • suspendlayout / resumelayout(这是win32)
    • 将父级设置为不可见,并在完成后将其设置为可见
  • 还有另一种方法可以更快地完成同样的事情吗? (竞争控制,3d派对等)

答案 1 :(得分:1)

预告:已经有一段时间了,所以微软可能已经修复了win8 app UI虚拟化。我没有检查过。

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