1

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

3 に答える 3

2

やってみて!:) どちらもバックグラウンド スレッドから UI を更新できないことがわかります。代わりにControl.BeginInvoke、UI スレッドで作業を呼び出すために使用する必要があります。その場合、呼び出した順序で実行されますBeginInvoke

于 2013-06-27T05:39:39.287 に答える
1

どちらのスレッドも GUI を更新できません。

「InvokeRequired」をチェックしないと、クロススレッド例外が発生する可能性があります。

これらのスレッドが同じメソッドにアクセスしたい場合は、相互排除の概念を使用できます。

相互排除の詳細については、こちらをご覧ください。

スタック オーバーフローに関するこの質問では、相互排除についても詳しく説明しています。

于 2013-06-27T05:51:13.650 に答える