C# Invoke,BeginInvoke

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "AAA");
            invokeThread = new Thread(new ThreadStart(StartMethod));
            invokeThread.Start();
            string a = string.Empty;
            for (int i = 0; i < 3; i++)      //调整循环次数,看的会更清楚
            {
                Thread.Sleep(1000);
                a = a + "B";
            }
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + a);
        }
        private void StartMethod()
        {
            
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "CCC");
            button1.Invoke(new invokeDelegate(invokeMethod));
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "DDD");
        }

        private void invokeMethod()
        {
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "EEE");
        }

AAA-》CCC 3秒后-》EEE 阻塞主线程-》 BBBDDD

对于子线程来说,一定会执行完委托(EEE)后才会执行DDD和BBB

      private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "AAA");
            invokeThread = new Thread(new ThreadStart(StartMethod));
            invokeThread.Start();
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "YYY");
            
        }
        private void StartMethod()
        {
            
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "CCC");            
            button1.Invoke(new invokeDelegate(invokeMethod));          
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "DDD");
        }

        private void invokeMethod()
        {            
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "EEE");
        }

AAA->YYY&CCC->EEE阻塞->DDD

子线程执行完EEE后才能执行DDD

猜测button1.Invoke 把任务提交给主线程后,会同步阻塞主线程和子线程的执行

      private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "AAA");
            invokeThread = new Thread(new ThreadStart(StartMethod));
            invokeThread.Start();           
            string a = string.Empty;
            for (int i = 0; i < 3; i++)      //调整循环次数,看的会更清楚
            {
                Thread.Sleep(1000);
                a = a + "B";
            }
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + a);
        }
        private void StartMethod()
        {
            button1.BeginInvoke(new invokeDelegate(invokeMethod));
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "DDD");
        }

        private void invokeMethod()
        {            
            MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() + "EEE");
        }

   子线程DDD不会被阻塞,在button1.BeginInvoke交给主线程后,只有EEE执行后才会BBB

猜你喜欢

转载自www.cnblogs.com/halfmoon/p/10492846.html