【问题标题】:C# MultiThreading In A GUI EnvironmentGUI 环境中的 C# 多线程
【发布时间】:2012-03-22 23:21:39
【问题描述】:

为什么当我运行程序时 for 不能并行运行 在“一”之后是完成 “二”在开始 在此先感谢(我是 C# 中的菜鸟)

    private void button1_Click(object sender, EventArgs e)
    {

      Thread  t = new Thread(new ThreadStart(Threadtest));
      t.Start();

      for(int i = 0 ;i<5;i++)
         richTextBox1.Text = richTextBox1.Text + "one"+i+"\n";
    }
    private void Threadtest()
    {
        for (int i = 0; i < 5; i++)
        {
            MethodInvoker action = delegate { richTextBox1.Text = richTextBox1.Text + "two" + i + "\n"; };
            richTextBox1.Invoke(action);
        }

    }

【问题讨论】:

    标签: c# multithreading user-interface


    【解决方案1】:

    您需要进行 5 次以上的迭代。在你的“一个”东西完成之前,线程甚至没有被启动。

    此外,由于您的“一个”代码从不休眠,它可能会在允许您通过 Invoke 编组的代码运行之前运行完成。 Invoke/BeginInvoke 导致代码在 UI 线程上运行 - 这在 UI 线程没有其他工作要做之前不会发生。

    DoEvents 将启用它。但这不是您通常应该用于多线程的东西。它只是有助于说明多线程。

    【讨论】:

    • Invoke 是阻塞的,如果调用 off-gui,它将永远无法调用该操作。
    • @payo 我相信您误解了 Invoke 和 BeginInvoke 之间区别的本质。从你所说的,Invoke 完全没用。唯一的区别是 Invoke 等待操作完成 - 仍然在 UI 线程上。 BeginInvoke 在 UI 线程上运行,但不等待完成。
    • 谢谢 - 是的,从 gui 线程调用会导致死锁。因此只有在InvokeRequired 时才调用invoke。 stackoverflow.com/questions/2055960/…
    • 套用 Eric Lippert 在他的一篇文章中的说法,假设一个线程需要大约一个世纪才能启动,因为从 CPU 的角度来看,它需要这么长时间。永远不要假设一个线程会“足够快地执行 x”。也就是说,Payo实际上是正确的。由于 UI 线程仍在处理按钮单击事件,因此来自 Invoke 调用的 windows 消息将排队,直到 UI 线程完成处理“ones”
    • @ChrisShain 这就是我的第二/第三段所说的。但这与他们使用的是 Invoke 还是 BeginInvoke 无关。但正如 payo 所指出的,您不应该从 UI 线程调用 Invoke。 (此代码不这样做)
    【解决方案2】:

    编辑 3:再次更正

    线程循环不是“编织”更新,因为您的非线程循环不会将控制权返回给主 gui 事件循环,该循环将处理来自线程的事件。因此,这一切都发生在之后。 “看到”这种情况的一种解决方案是生成两个线程。

    【讨论】:

    • 即使没有并行运行这些动作,它也只是将它们全部提交给事件线程串行运行。这只是允许它们并行“排队”
    • 已修复 - 我从错误的心态开始,因为我一开始就误读了他的问题。
    【解决方案3】:

    GUI 环境是单线程的。而且您对此无能为力。这就是 Windows 中的 GUI 的设计方式。

    Invoke 只是在当前操作 button1_Click 完成后将 GUI 线程上的操作排入队列。

    您可以使用Appllication.DoEvents 在继续之前处理排队的任何内容,但 UI 仍然是单线程的。

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多