C# winforms的并发数据加载

C# winforms的并发数据加载,c#,winforms,multithreading,invoke,C#,Winforms,Multithreading,Invoke,所以我的问题是这个。我有一个表格,里面有一个面板。此面板用作多个不同用户控件的容器,一次只能看到其中一个。有些用户控件显示了来自数据库的大量数据,因此加载它们需要一点时间(数据显示在绑定的datagridview中)。我尝试为这些控件创建一个LoadData方法,然后在单独的线程中启动,一旦它们完成工作,它们就会启用主窗体上的实际按钮来显示它们 然而,有许多不同的问题。首先,在创建usercontrol的句柄之前,我不能调用this.Invoke,这似乎很难强制执行,特别是如果我想在初始化过程中

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

然而,有许多不同的问题。首先,在创建usercontrol的句柄之前,我不能调用this.Invoke,这似乎很难强制执行,特别是如果我想在初始化过程中显示启动屏幕(主窗体的句柄尚未创建)

我通过设置form.Visible=true,然后调用form.CreateControl,然后再调用form.Visible=false,成功地实现了这一点。但是,这确实会显示表单在屏幕上闪烁,这看起来不太好

如果尚未创建句柄,我也尝试不使用Invoke,但这会导致在不同线程中创建数据对象,然后无法访问控件的“正常”线程的问题

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


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

很难知道从哪里开始

无法确定您的问题是过早优化,还是试图重新安装多线程

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

将所有同步功能从等式中排除,并为您提供最大范围的优化,以获取和设置控件


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

如果用户在加载数据时无法与程序交互,那么将数据加载移动到线程中不是毫无意义吗?在启动过程中加载的控件数据较少,并且可以立即使用。这更像是一个复古多线程-有点问题。是的,对控件和面板功能的描述非常准确。这听起来是一个很好的解决方案,但是如何才能让线程返回一些东西呢?我甚至不知道这样的事情是可能的。嗯,是的,这就是我正在使用的,但这是将数据传递给线程,而不是返回数据的线程。但是哦,好吧,我想我会设法弄明白的。这应该会有帮助。有几种选择。