我有一些表单需要一些时间才能打开,因为它们目前在 Load 事件处理程序中从数据库中获取了一些内容。
是否有可能以某种方式在单独的线程中加载表单并在完成后将它们显示给用户?
如果加载它们以便触发 Load 事件处理程序是不可能的,也许有一个 IPreloadable
接口(interface)可以用 Preload
方法来解决这个问题,然后移动缓慢加载内容。如果可以从一个单独的线程显示表单,那是……我猜我需要使用 Invoke 或类似的东西吗?
最佳答案
如果您在不同的线程上加载不同的表单,您在表单之间进行调用时必须非常小心 - 您需要使用 Control.Invoke
/BeginInvoke
无处不在。
请注意,虽然每个顶级窗口 都可以在不同的线程上运行,但必须创建一个窗口内的所有控件(或者更确切地说,它们必须创建它们的句柄 ) 在该窗口的线程上。
为什么不在后台加载数据库信息,然后当加载完成时然后您可以构建实际的表单并显示它? (在那之前,您可能想要更改为等待光标,或者可能在某处放置“正在加载数据...”状态消息。
关于C#:在单独的线程上预加载表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390539/