使用winforms并行加载数据

本文关键字:数据 加载 并行 winforms 使用 | 更新日期: 2023-09-27 18:27:56

所以我的问题是这个。我有一个表单,里面有一个面板。这个面板是多个不同用户控件的容器,一次只能看到一个。其中一些用户控件显示了来自数据库的大量数据,因此加载它们需要一点时间(数据显示在绑定的datagridview中)。我尝试为这些控件创建一个LoadData方法,然后在单独的线程中启动,一旦它们完成了工作,它们就会在主窗体上启用实际的按钮来显示它们。

然而,也存在许多不同的问题。首先,我不能这么说。在用户控件上调用,直到创建其句柄,这似乎很难强制执行,尤其是如果我想在初始化期间显示一个启动屏幕(主窗体的句柄尚未创建)。

我通过设置form.Visible=true,然后调用form.CreateControl和form.Visible=false来强制执行此操作。然而,这确实显示了表单在屏幕上闪烁,这看起来不太好。

如果句柄还没有创建,我也尝试过不使用Invoke,但这让我遇到了数据对象在另一个线程中创建,然后控件的"正常"线程无法访问的问题。

因此,很明显,当涉及到多线程时,我非常困惑,尤其是在winforms中,在应用程序启动时更是如此。我的解释可能也相当混乱,但如果需要的话,我会尽力澄清。

那么,正确的方法是什么呢?

使用winforms并行加载数据

很难知道从哪里开始。

不知道你的问题是过早乐观,还是试图重新适应多线程。

如果我说一个六个按钮和一个面板,这些按钮将面板中的用户控件翻转为可见,我的线程将返回一个用户控件,然后我将其添加到面板中,然后启用它的相关按钮。

将所有同步的东西从等式中删除,并为您提供最大的乐观空间——获得和设置控件。

或者,你可以设置所有的用户控件,但不绑定它们,并在完成时让线程绑定,不过我更喜欢前一种方式,更抽象一点,你可以定义一个视图,用一些有用的属性标记它,然后让你的主窗体启动一个"就这么做"的过程。