GUI环境中的C#MultiThreading

时间:2012-03-22 23:21:39

标签: c# multithreading user-interface

为什么当我运行程序时,for的并不是并行运行的 在“一”之后完成“两个”开始 提前谢谢(我是C#中的noobie)

    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);
        }

    }

3 个答案:

答案 0 :(得分:3)

您需要进行超过5次迭代。在你的“一件”事情完成之前,线程甚至没有被激活。

此外,因为您的“一个”代码永远不会休眠,所以它可能会在允许您通过Invoke编组的代码完全运行之前运行完成。 Invoke / BeginInvoke导致代码在UI线程上运行 - 直到UI线程没有其他工作要做才能发生。

DoEvents可以实现这一点。但这不是通常用于多线程的东西。它只是有助于多线程的这种说明。

答案 1 :(得分:2)

编辑3:再次纠正

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

答案 2 :(得分:1)

GUI环境是单线程的。并且你无能为力。这就是Windows中GUI的设计方式。

Invoke仅在完成当前操作button1_Click之后完成GUI线程上的操作排队。

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