在我的程序中,有一个地图编辑器,从数据库加载信息后,我需要生成一些自定义控件(取决于地图的6000-10000)。不幸的是,它锁定了用户的屏幕10-20秒。UI强化应用程序
我该如何使用延迟加载?我怎样才能没有崩溃和锁定屏幕?
在我的程序中,有一个地图编辑器,从数据库加载信息后,我需要生成一些自定义控件(取决于地图的6000-10000)。不幸的是,它锁定了用户的屏幕10-20秒。UI强化应用程序
我该如何使用延迟加载?我怎样才能没有崩溃和锁定屏幕?
这个问题是广泛的。但我可以给你一些提示。首先,我很肯定你不需要这么多的自定义控件。考虑用户拥有多少输入设备,他不能与同时与多个控件进行交互。所以你可以用几种不同的方式“欺骗”这些控件。例如,显示控件的图像,并在用户开始与其交互时切换它。 另一件事是,你不需要你看不到的东西。如果只有10个元素适合屏幕,为什么要创建10000个元素的列表?没有理由,这就是为什么有办法缓解这种情况,一种叫做Virtualization,可以通过多种方式完成。您可以使用UI虚拟化,推迟加载ui组件或使用数据虚拟化。另一件事,与数据虚拟化合作是使用线程或后台工作人员来处理大量数据的负载。批量创建数据以提供UI线程时间来处理窗口消息。
看看Binding或在后台线程中工作? 如果它们在ListView中,请查看虚拟模式: http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx
什么是您将这些控件加载到?你是否在UI线程中执行它?
大多数这些控件都有图像,都在画布内,不幸的是我无法使用此解决方案。 – 2012-03-08 17:59:27
使用TPL(任务并行库)做一个单独的线程的DB任务......它看起来像这样:
Task.Factory.StartNew(() => MyLongRunningMethod));
检查CodeProject上了this伟大的文章,在获取更多信息......
编辑:如下所述,原始答案意味着某种控制方式可以在单独的线程上生成,但实际上作为可视化树的一部分,因此必须在UI线程上生成控件,以便不是有效建议...
编辑:没有看到它将如何在符号屏幕上适应10000个自定义控件,因此必须有一种方法来使用某种类型的虚拟化架构,其中只有可见控件会生成,而其余控件会得到根据需要生成...
这似乎是一个很好的解决方案,感谢分享。 – 2012-03-08 18:14:09
np,很高兴我可以帮助... – 2012-03-08 18:19:09
不幸的是,我还没有找到一种方法来使用任务来创建和管理可视组件... – 2012-03-12 18:18:18
这些控件中的大多数都具有图像,并且都在画布内.. 所示为显示在屏幕上的地图,不幸的是您必须查看整个地图,但正如你所说,也许我可以删除他当然没有使用的其他信息,或尝试某种形式的虚拟化。 – 2012-03-08 18:03:12
您只有一定数量的像素,当向用户显示数据时,您可以并且通常必须始终伪造和作弊。看看谷歌地图,例如,他们没有一个巨大的形象,他们巧妙地重新加载和缓存。像这样的事情也可能是你的一种方式。 – dowhilefor 2012-03-08 18:37:51
我在我的应用程序中发现了大问题。递归地在另一个画布内封装一个画布..它真的很重,我正在改变操作.. – 2012-03-12 18:27:33