我有一系列表格并在它们之间导航。
每个表单都有一组控件,我从 SQLite 数据库加载属性,这是一个漫长的(大约 1 秒)操作,不会给用户最好的感觉,因为表单是逐渐绘制的。
我不太介意延迟,但我希望在加载所有数据时绘制表单。我想避免使用新线程,因为这会导致跨线程操作问题。
除了通过缓存加载的数据来加速整个应用程序之外,还有什么好的解决方案吗?
我有一系列表格并在它们之间导航。
每个表单都有一组控件,我从 SQLite 数据库加载属性,这是一个漫长的(大约 1 秒)操作,不会给用户最好的感觉,因为表单是逐渐绘制的。
我不太介意延迟,但我希望在加载所有数据时绘制表单。我想避免使用新线程,因为这会导致跨线程操作问题。
除了通过缓存加载的数据来加速整个应用程序之外,还有什么好的解决方案吗?
有一种简单的方法可以加快许多控件的感知性能,尤其是数据密集型控件,如列表视图、列表框、组合框等。
在填充它们之前调用 BeginUpdate() 方法,完成后调用 EndUpdate()。这将禁用控件的重绘,直到您用数据填充它。
对不起。这就是线程的用途。“跨线程操作问题”定义明确,并且有处理它们的通用模式。只需将线程交互的地方减少到最低限度(在这种情况下,它将是一个地方——在加载数据之后),它就变得微不足道了。
还有一些类使 winforms 应用程序中的多线程变得更加容易,因为它们抽象了线程之间的交互。BackgroundWorker (链接到有关它的博客文章)将为您在另一个线程上执行工作,并通过在 UI 线程上触发事件来通知您何时完成。您可以获得多线程的好处而没有任何陷阱。
我发现加载 Winform 控件(如组合框和列表框)在指向视图而不是表本身时加载速度要快得多,特别是如果您可以将视图限制为与必须查看的控件相比更精简整张桌子。
这个链接有一些很好的解决方案,据我认为 BackgroundWorker 进程应该有帮助。 http://devcomponents.com/blog/?p=361
回到 VB 时代,我使用 LockWindowUpdate API。由于这需要一个窗口句柄,它应该也可以用于 WinForms。虽然,从未尝试过。