1. 程式人生 > >控制元件的Invoke和BeginInvoke

控制元件的Invoke和BeginInvoke

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(object
sender, 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"); }