C# 如何从其他线程生成winform的GUI?
我需要通过Thread2的结果为Thread1中的winform生成GUI 但是Thread1从Thread2开始C# 如何从其他线程生成winform的GUI?,c#,multithreading,winforms,C#,Multithreading,Winforms,我需要通过Thread2的结果为Thread1中的winform生成GUI 但是Thread1从Thread2开始 如果Thread2的结果等于1,我需要在winfrom上显示一个网格,否则在Winform上显示一个选项卡控件。UI线程必须构建它或至少将它添加到表单中 但是在线程2中,您可以收集所有必需的信息或控件,并通过调用或作为BackgroundWorker结果将它们传递给UI线程。您应该只保留一个UI线程,而不要在另一个线程中创建任何UI元素 Microsoft有许多关于此主题的文章,并
如果Thread2的结果等于1,我需要在winfrom上显示一个网格,否则在Winform上显示一个选项卡控件。UI线程必须构建它或至少将它添加到表单中
但是在线程2中,您可以收集所有必需的信息或控件,并通过调用或作为
BackgroundWorker
结果将它们传递给UI线程。您应该只保留一个UI线程,而不要在另一个线程中创建任何UI元素
Microsoft有许多关于此主题的文章,并演示了处理异步操作的正确方法,例如
如果我理解正确,则需要在一个线程中创建GUI元素,以便以后在GUI线程中使用它们 据我所知,这是不可能的,因为控件会记住它创建时所在的线程,然后检查调用是否在该线程内进行 我建议您只在后台线程中生成数据,并将其传递给gui线程,在那个里您可以绑定此数据或生成ui元素来表示它。此外,它符合分离关注点的最佳实践
Lex Li已经在关于将数据传递到GUI线程的问题上发表了评论。我不确定,我能正确理解您的问题,但下面是在不同线程中创建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();
你为什么这样写?很难阅读。这对我来说毫无意义。你不能从另一个线程更新UI。关于如何封送对UI线程的更改以进行更新,已经有多个答案。在.NET4.5中,使用
async\await
非常容易。在.NET4.0中,使用任务稍微复杂一些。在以前的版本中,使用BackgroundWorker或调用都很麻烦这不是我的答案你能通过代码帮助我吗?@MohsenVaziri首先你发布了一些代码,显示你正在尝试做什么。我不知道如何为这个问题编码,并且无法通过搜索找到此问题的结果我们不知道您如何为该控件的数据创建控件。在另一个线程上不需要控件本身。也许您的BackgroundWorker
应该只加载将加载到已经存在的UI控件中的数据。请看这里:DoWorkEventArgs类有一个结果对象,您可以在其中将数据传递给前台由OnRunWorkerCompleted事件处理的线程。我知道,但我需要从其他线程创建UI,但我在异常硬件上工作。无论您在哪个硬件上,都应该遵循经验法则。我使用一个硬件来创建Thread2,这个硬件在一个线程中生成代码,并注入代码以正确工作。两个GUI线程在一个应用程序中会和平共存吗?