实际上我正在创建一个应用程序,其中有8个标签页,每个页面包含我在运行时添加的大约10个组合框。而且他们的项目也从excel文件中获取。要选择这些组合框中的项目,我必须执行数据库操作。 所有这些都发生在Form_Load事件中。由于这种形式的加载需要时间。 我必须提高性能(即减少加载时间)。我怎么能这样做? 我可以使用mulltithreading吗?但我认为这可能会给交叉线程操作带来异常。 任何建议.. 提前谢谢。
答案 0 :(得分:2)
只有在标签可见时填充标签,才能节省加载时间吗?您知道用户何时通过处理标签的SelectedIndexChanged
事件选择了标签。
答案 1 :(得分:0)
您可以使用BackgroundWorker。它可以让您在加载数据之前显示表单。另外,请查看以下提示:Threading in Windows Forms。
答案 2 :(得分:0)
我建议在尝试任何多线程方法之前,先尝试一些缓存或预加载。是否有机会在加载表单之前将相关数据从Excel或数据库加载到内存中,并重复使用此数据,除非原始源更改?当然,为此,您需要一种更新机制,以检测Excel文件或数据库数据何时可能已更改且内存中的数据无效。
答案 3 :(得分:0)
如果您启动后台线程来加载您随后设置为控制的数据,那么您必须再次检查InvokeRequired
然后再检查Invoke()
函数以进入UI线程。
您还必须禁用后期加载的UI元素,直到它们被加载为止。此外,您可能必须延迟保存任何数据,直到加载了所有可加载元素(如果您总是最终设置所有选项卡中的所有数据)。
我会避免预加载任何数据库数据,因为它很容易开始陷入非常奇怪的问题。当然nHibernate缓存是一个不同的东西,可以毫不费力地使用。
您还可以优先考虑实际显示哪个选项卡并首先预加载这些选项卡。这当然也会妨碍吞吐量,因为在多核机器上你可以拥有更多的预加载器线程,一个触摸DB,另一个excel,第三个做它做的任何事情;所有的同时。
答案 4 :(得分:0)
我赞成hawbsl的回答;给人以快速的印象通常与实际快速进行用户界面工作一样有用。
但是,我不禁要提一件事。您似乎可能想要检查加载数据的代码。使用分析器查看花费的时间。如果不了解更多关于代码的信息,就不可能肯定地说,但似乎加载那么多数据似乎不需要很长时间。例如,如果您使用.NET数据提供程序读取Excel数据(通过ODBC?),代码是否为每个组合框获取新连接?连接池通常应该防止这是一个问题(我只是猜测数据是如何加载的,所以它可能不适用)。