control.invoke主要用于在非Ui线程更新控件,这里要注意的是,当ui线程阻塞时,在非Ui线程中的control.invoke也会阻塞,control.invoke会一直等到Ui线程有空闲了才会执行control.invoke,如果不想让非ui线程发生阻塞,那么使用control.begininvoke
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "开始")
{
start = true;
threadRun = new Thread(Run);
threadRun.IsBackground = true;
threadRun.Start();
button1.Text = "停止";
}
else
{
start = false;
Thread.Sleep(5000);
button1.Text = "开始";
string str = label1.Text;
Console.WriteLine(str);
listBox1.Items.Add(str);
}
}
private void Run()
{
while (start)
{
for (int i = 0; i < 100; i++)
{
this.Invoke(new Action(() =>
{
label1.Text = number[i].ToString();
}));
}
}
}
按钮由停止变成开始时,有5秒的阻塞,此时线程threadRun由于this.invoke的影响也会发生阻塞,等到5秒后,lable1.text的值也会得到更新。