1

What happens when more than one thread tries to call a form method using Invoke which updates form controls at the same time in Winforms?

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

3 回答 3

2

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

于 2013-06-27T05:39:39.287 回答
1

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

如果您不检查“InvokeRequired”,您可能会遇到跨线程异常。

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

您可以在此处找到有关互斥的更多信息。

这个关于堆栈溢出的问题也详细解释了互斥。

于 2013-06-27T05:51:13.650 回答
0

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

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

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

于 2013-06-27T08:28:38.837 回答