控制元件的Invoke和BeginInvoke
阿新 • • 發佈:2018-11-15
1.Control.Invoke
Invoke 委託會導致執行緒的阻塞,但是是順序執行的,
private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("begin"); listBox1.Invoke(new Action(() => { listBox1.Items.Add("invoke"); })); listBox1.Items.Add("after"); }
2.Control.BeginInvoke
BeginInvoke 委託同樣會導致執行緒的阻塞,在執行完當前執行緒後才會執行,
private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("begin"); listBox1.BeginInvoke(new Action(() => { listBox1.Items.Add("begininvoke"); })); listBox1.Items.Add("after"); }
若想要線上程執行結束之前執行 BeginInvoke,可以使用 EndInvoke,
private void Form1_Load(objectsender, EventArgs e) { listBox1.Items.Add("begin"); var i = listBox1.BeginInvoke(new Action(() => { listBox1.Items.Add("begininvoke"); })); listBox1.EndInvoke(i); listBox1.Items.Add("after"); }
或者 BeginInvoke 會在一個 Invoke 呼叫前執行,
private void Form1_Load(object sender, EventArgs e) { listBox1.Items.Add("begin"); listBox1.BeginInvoke(new Action(() => { listBox1.Items.Add("begininvoke"); })); listBox1.Invoke(new Action(() => { listBox1.Items.Add("invoke"); })); listBox1.Items.Add("after"); }