【问题标题】:How I Can Generate GUI For winform From Other Thread? [closed]如何从其他线程为 winform 生成 GUI? [关闭]
【发布时间】:2014-02-19 17:39:41
【问题描述】:

我需要根据 Thread2 的结果为 Thread1 中的 winform 生成 GUI!

但是 Thread1 从 Thread2 开始。

如果 Thread2 的结果等于 1,我需要在我的 winfrom 上显示一个网格,否则在我的 Winform 上显示一个选项卡控件。

【问题讨论】:

  • 你为什么要这样写,很难读
  • 这对我来说是零意义。
  • 您无法从另一个线程更新 UI。关于如何编组对 UI 线程的更改以进行更新,已经有多个答案。在 .NET 4.5 中,使用 async\await 非常容易。在 .NET 4.0 中,使用任务稍微多一些。在以前的版本中,使用 BackgroundWorker 或 Invoke 很麻烦
  • link这不是我的答案

标签: c# multithreading winforms


【解决方案1】:

UI 线程必须构建它或至少将它添加到表单中。

但在线程 2 中,您可以收集所有必需的信息或控件,并通过调用或作为 BackgroundWorker 结果传递给 UI 线程。

【讨论】:

  • 你能帮我写代码吗?
  • @MohsenVaziri 首先发布一些代码,显示你正在尝试做什么。
  • 我不适合这个问题的编码,并且无法通过搜索找到这个问题的结果
  • 我们不知道您如何为该控件的数据创建控件。控件本身不应该在另一个线程上需要。也许您的BackgroundWorker 应该只加载数据,这些数据将被加载到您已经存在的 UI 控件中。看看这里:stackoverflow.com/questions/6365887/… DoWorkEventArgs 类有一个 Result 对象,您可以在其中将数据传递给由 OnRunWorkerCompleted 事件处理的前台线程。
【解决方案2】:

您应该只保留一个 UI 线程,并且永远不要在另一个线程中创建任何 UI 元素。

微软有很多关于这个主题的文章,并演示了处理异步操作的正确方法,例如

http://msdn.microsoft.com/en-us/library/ms951089.aspx

【讨论】:

  • 我知道,但我需要从其他线程制作我的 UI,但我在异常硬件上工作。
  • 无论您使用什么硬件,都应该遵循经验法则。否则,您会想到除了您自己之外没有人必须面对的问题。
【解决方案3】:

如果我理解正确,则需要在一个线程中创建 GUI 元素,以便以后在 GUI 线程中使用它们。

据我所知,这是不可能的,因为控制会记住创建它的线程,然后检查是否在该线程中进行了调用。

我建议您仅在后台线程中生成数据并将其传递给 gui 线程,您可以在其中绑定此数据或生成 ui 元素来表示它。而且它符合关注点分离的最佳实践。

Lex Li 已在 cmets 中发布了link 专门用于将数据传递到 GUI 线程的问题。

【讨论】:

  • 我使用硬件创建线程 2,该硬件在线程中生成代码并注入代码以正常工作
【解决方案4】:

我不确定,我能正确理解您的问题,但这里是在不同线程中创建 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();

【讨论】:

  • 两个GUI线程会在一个应用程序中和平共存吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多