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