winforms 如何从其他线程为winform生成GUI?[已关闭]

toiithl6  于 2023-01-02  发布在  其他
关注(0)|答案(4)|浏览(113)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

八年前就关门了。
Improve this question
我需要使用Thread2的结果在Thread1中为WinForm生成GUI。
但是,线程1应从线程2开始。
如果Thread2的结果等于1,我需要在我的WinForm上显示一个网格。如果不是,我需要在我的WinForm上显示一个选项卡控件。

ffvjumwh

ffvjumwh1#

UI线程必须生成它,或者至少将它添加到窗体中。
但在线程2中,您可以收集所有必需的信息或控件,并通过调用或作为BackgroundWorker结果将它们传递给UI线程。

balp4ylt

balp4ylt2#

您应该只保留一个UI线程,并且永远不要在另一个线程中创建任何UI元素。
Microsoft有许多关于此主题的文章,并演示了处理异步操作的正确方法,例如
http://msdn.microsoft.com/en-us/library/ms951089.aspx

oxcyiej7

oxcyiej73#

如果我理解正确的话,需要在一个线程中创建GUI元素,以便以后在GUI线程中使用它们。
据我所知,这是不可能的,因为控制记住了创建它的线程,然后检查是否在该线程内进行了调用。
我建议你只在后台线程中生成数据,并将其传递给gui线程,在那里你可以绑定这些数据或生成ui元素来表示它,而且这符合关注点分离的最佳实践。
Lex Li已经在评论中发布了link,专门讨论将数据传递到GUI线程的问题。

eanckbw9

eanckbw94#

我不确定,我可以正确理解您的问题,但这里是在不同线程中创建UI控件的代码。

var th = new Thread(() =>
    {
        //A sample form with a RichTextBox control.
        var f = new Form();
        f.Controls.Add(new RichTextBox() { Dock = DockStyle.Fill });

        Application.Run(f);
    });

th.SetApartmentState(ApartmentState.STA);
th.Start();

相关问题