UI密集型应用程序

时间:2012-03-08 17:34:35

标签: wpf multithreading user-interface controls dispatcher

在我的程序中,有一个地图编辑器,在从数据库加载信息后,我需要生成一些自定义控件(6000-10000,具体取决于地图)。不幸的是,它会锁定用户的屏幕10-20秒。

如何使用延迟加载?如果没有崩溃和锁定屏幕怎么办?

3 个答案:

答案 0 :(得分:2)

这个问题很广泛。但我可以给你一些提示。 首先,我非常确定您不需要这么多自定义控件。想想用户拥有多少输入设备,他无法同时与多个控件进行交互。因此,您可以通过几种不同的方式“欺骗”这些控件。例如,显示控件的图像,并在用户开始与其交互时切换它。 另一件事是,你不需要你看不到的东西。如果只有10个适合屏幕,为什么要创建10000个元素的列表?没有理由,这就是为什么有办法减轻这种情况,一种叫做Virtualization,可以通过多种方式完成。您可以使用UI虚拟化,推迟加载ui组件或使用数据虚拟化。 与数据虚拟化合作的另一件事是使用线程或后台工作程序来处理那么多数据的负载。批量创建数据,为UI Thread提供处理Windows消息的时间。

答案 1 :(得分:1)

查看Binding或在后台线程中完成工作? 如果它们在ListView中,请查看VirtualMode: http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

您将这些控件加载到什么内容?你是在UI线程中做的吗?

答案 2 :(得分:0)

使用TPL(任务并行库)在单独的线程上执行数据库任务......它看起来像这样:

Task.Factory.StartNew(() => MyLongRunningMethod));

查看this有关CodeProject的精彩文章,了解更多信息......

编辑:如下所述,原始答案暗示某些控件可以在单独的线程上生成,但实际上作为可视树的一部分,因此UI,控件必须在UI线程上生成,因此不是有效的建议......

编辑:不要看看如何在一个单元屏幕上安装10000个自定义控件,因此必须有一种方法可以使用某种类型的虚拟化模式,其中只生成可见的控件,其余的控件将按需生成......