当多个线程尝试在Winforms中同时使用Invoke更新表单控件时会发生什么?

时间:2013-06-27 05:32:36

标签: c# .net multithreading winforms

当多个线程尝试使用在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;
        }

3 个答案:

答案 0 :(得分:2)

试一试! :)你会发现他们都不能从后台线程更新UI,而是需要使用Control.BeginInvoke来调用UI线程上的工作,在这种情况下,他们将按照他们调用的顺序执行{ {1}}。

答案 1 :(得分:1)

任何一个线程都无法更新GUI。

如果不选中“InvokeRequired”,则可能会出现跨线程异常。

如果您仍希望这些线程访问相同的方法,则可以使用互斥概念。

您可以在互斥here上找到更多信息。

堆栈溢出的

This question也详细解释了互斥。

答案 2 :(得分:0)

Invoke阻塞,直到线程完成执行更新方法。

但是,这实际上只是向GUI线程发出的消息,它等待它完成。由于GUI线程一次只能执行一个方法,因此没有真正的同时执行。没有什么不好的事情发生,但行为可能取决于执行的顺序。

然而,执行顺序取决于哪个线程完成了一些保证原子(锁定)操作。