C# 在后台工作程序中向GUI添加控件

C# 在后台工作程序中向GUI添加控件,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个带有顶部和底部面板的表单。 用户将在顶部面板中进行选择,每次他们更改一个关键字段上的值时,我将销毁底部面板中的控件,然后对另一个应用程序(通过COM)进行耗时的调用,并添加正在添加的新控件列表。此刷新过程需要几秒钟 我希望能够在刷新时禁用底部面板,并允许用户继续在顶部面板中工作。当然,这是在一个线程上运行的所有GUI 插图: 我使用BackgroundWorker,但它当然不能直接在主线程的GUI上创建控件 我是否可以这样做,即允许在后台禁用和重建GUI的一个部分,而用户继续处理另一个

我有一个带有顶部和底部面板的表单。
用户将在顶部面板中进行选择,每次他们更改一个关键字段上的值时,我将销毁底部面板中的控件,然后对另一个应用程序(通过COM)进行耗时的调用,并添加正在添加的新控件列表。此刷新过程需要几秒钟

我希望能够在刷新时禁用底部面板,并允许用户继续在顶部面板中工作。当然,这是在一个线程上运行的所有GUI

插图:

我使用BackgroundWorker,但它当然不能直接在主线程的GUI上创建控件

我是否可以这样做,即允许在后台禁用和重建GUI的一个部分,而用户继续处理另一个部分

我是否可以这样做,即允许在后台禁用和重建GUI的一个部分,而用户继续处理另一个部分

一般来说,没有。GUI元素/控件必须全部在UI线程上创建和使用,而不是在其他任何地方


创建此类场景的最佳方法通常是使用
BackgroundWorker
或其他技术在后台线程上获取所需数据,然后在数据完全加载后构建UI。

在几乎所有情况下,创建控件本身并不耗时,它正在创建控件所基于的数据,这非常昂贵。您需要在后台线程中创建该数据,然后在UI线程中从该数据创建控件。@Servy-谢谢,这是有道理的,但同时创建控件的主要原因是它们是用户控件,具有从辅助应用程序检索数据的嵌入功能(并建立自己)。请参阅我对Reed答案的评论;在屏幕外创建它们,然后将它们传递回主线程是否可行?我是否可以在后台工作程序中合成新的GUI元素,然后在最后将它们传递回主GUI线程?@Geoff No-它们需要在主线程上实际创建和使用。创建i这也是一个关键部分。好的,谢谢。我将按照您的建议来研究解耦控件的数据检索行为,然后在完成后创建控件。