【问题标题】:C#: Preloading forms on a separate threadC#:在单独的线程上预加载表单
【发布时间】:2009-09-07 18:40:30
【问题描述】:

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

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

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

【问题讨论】:

  • 也许我遗漏了一些东西,但您可以先 Hide() 表单,然后触发 BackgroundWorker 的 StartAsynchronous() 并在 BackgroundWorker 完成后显示表单。似乎太简单了。 :)

标签: c# winforms multithreading preloader


【解决方案1】:

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

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

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

【讨论】:

  • 在发生这种情况时,当然必须有一条状态消息,也许还有一个状态栏设置为选框或某处。但是你将如何在后台加载数据库信息然后构建实际的表单呢?比如,你在哪里做?在构造函数而不是加载事件处理程序中?还是根本不在表单中,而是在父表单中?
  • 使用 BackgroundWorker 执行此操作,然后让 RunWorkerCompleted 事件处理程序使用刚刚获取的数据。
  • 因此,使用空控件显示表单 -> 使用 BackgroundWorker 获取数据 -> 创建缺失/填充控件;或使用 BackGroundWorker 获取数据 -> 显示表单并填充控件?
  • 是的。我个人可能会选择后者。
  • 太棒了。然后必须尝试其中之一=)
最近更新 更多