当多个线程尝试使用在Winforms中同时更新表单控件的Invoke调用表单方法时会发生什么?
static thCount = 0;
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t1 = new System.Threading.Thread(start);
System.Threading.Thread t2 = new System.Threading.Thread(start);
t1.Start();
t2.Start();
}
private void start()
{
System.Threading.Thread.Sleep(300);
Invoke(new MethodInvoker(guiUpdate));
}
private void guiUpdate()
{
this.label1.Text = "Updated.." + (thCount++);
this.label1.Update();
}
private void Form1_Load(object sender, EventArgs e)
{
this.label1.Text = System.Threading.Thread.CurrentThread.Name;
}
答案 0 :(得分:2)
试一试! :)你会发现他们都不能从后台线程更新UI,而是需要使用Control.BeginInvoke
来调用UI线程上的工作,在这种情况下,他们将按照他们调用的顺序执行{ {1}}。
答案 1 :(得分:1)
任何一个线程都无法更新GUI。
如果不选中“InvokeRequired”,则可能会出现跨线程异常。
如果您仍希望这些线程访问相同的方法,则可以使用互斥概念。
您可以在互斥here上找到更多信息。
堆栈溢出的This question也详细解释了互斥。
答案 2 :(得分:0)
Invoke
阻塞,直到线程完成执行更新方法。
但是,这实际上只是向GUI线程发出的消息,它等待它完成。由于GUI线程一次只能执行一个方法,因此没有真正的同时执行。没有什么不好的事情发生,但行为可能取决于执行的顺序。
然而,执行顺序取决于哪个线程完成了一些保证原子(锁定)操作。