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