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
浙公网安备 33010602011771号