为什么当我运行程序时,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);
}
}
答案 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仍然是单线程的。