private void button1_Click(object sender, EventArgs e) { this.textBox1.Text = "1"; this.Invoke(new EventHandler(delegate { this.textBox1.Text += "2"; })); this.textBox1.Text += "3"; }
结果为:123异步
private void button1_Click(object sender, EventArgs e) { this.textBox1.Text = "1"; this.BeginInvoke(new EventHandler(delegate { this.textBox1.Text += "2"; })); this.textBox1.Text += "3"; }
结果为132this
结论:一、Invoke会阻止当前主线程的运行;BeginInvoke不会阻止当前主线程的运行,而是等当前主线程作完事情以后再执行BeginInvoke中的代码内容。spa
二、这2个方法都是由主线程运行的,并非异步执行,若是代码耗时过长,一样会形成界面卡死线程
Invoke阻止的是工做线程,至关于阻塞式(非建立控件线程或主线程),BeginInvoke是不等待主线程完成变马上返回执行下面操做,至关于异步式。
这里的阻塞或异步是相对于工做线程,而非主线程。
它阻塞或异步的是调用Invoke或BeginInvoke的线程。code