C#:在单独的线程上预加载表单

标签 c# winforms multithreading preloader

我有一些表单需要一些时间才能打开,因为它们目前在 Load 事件处理程序中从数据库中获取了一些内容。

是否有可能以某种方式在单独的线程中加载表单并在完成后将它们显示给用户?

如果加载它们以便触发 Load 事件处理程序是不可能的,也许有一个 IPreloadable 接口(interface)可以用 Preload 方法来解决这个问题,然后移动缓慢加载内容。如果可以从一个单独的线程显示表单,那是……我猜我需要使用 Invoke 或类似的东西吗?

最佳答案

如果您在不同的线程上加载不同的表单,您在表单之间进行调用时必须非常小心 - 您需要使用 Control.Invoke/BeginInvoke 无处不在。

请注意,虽然每个顶级窗口 都可以在不同的线程上运行,但必须创建一个窗口内的所有控件(或者更确切地说,它们必须创建它们的句柄 ) 在该窗口的线程上。

为什么不在后台加载数据库信息,然后当加载完成时然后您可以构建实际的表单并显示它? (在那之前,您可能想要更改为等待光标,或者可能在某处放置“正在加载数据...”状态消息。

关于C#:在单独的线程上预加载表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390539/

相关文章:

c# - 我如何识别代表 SZ-Array 的 System.Type 实例?

c# - 如何指定 cookie 有效期?

c# - 如何显示带有子节点的加号和减号?

java - java中Thread.join(毫秒)不准确吗?

javascript - 我怎么知道我已经达到了 Node 中定义的线程限制?

c# - 在没有数据重复的情况下转换/实例化/转换为子类/父类(super class)

c# - Winform 和用户控制 - C#

c# - Winforms DataBinding 是否适用于以编程方式更改的属性?

c# - 在 datagridview 列中包含的按钮上添加一个事件

java - 我正在尝试使用线程在小程序中移动球,但它没有移动