控件Invoke和BeginInvoke的区别,代码实现看实际效果 。
Invoke必须等代码完成后,才会执行后面的代码。(同步线程。for循环执行完成后才继续)
BeginInvoke执行完代码,马上继续执行后面的代码。看文本控件上显示的值,很容易看出来。(异常线程。for循环未执行完成,直接执行后面的代码)
public partial class Form1 : Form
{
//界面上2个Button 2个Label 2个Textbox 控件
public Form1()
{
InitializeComponent();
}
//Button1 单击事件 1个Textbox取名为TXT_Invoker,显示值的变化情况
private void button1_Click(object sender, EventArgs e)
{
this.Invoke(new Action(() => //同步线程。必须等内部执行完成,才会继续执行后面的代码。阻塞
{
for (int i = 0; i < 10; i++)
{
TXT_Invoke.Text = i.ToString();
Thread.Sleep(1000);
Application.DoEvents();
}
}));
TXT_Invoke.Text = 100.ToString();
Thread.Sleep(1005);
}
//Button2 单击事件 1个Textbox取名为TXT_BeginInvoke,显示值的变化情况
private void button2_Click(object sender, EventArgs e)
{
this.BeginInvoke(new Action(() => //异常线程。不管内部是否执行完都会继续下去,非阻塞
{
for (int i = 0; i < 10; i++)
{
TXT_BeginInvoke.Text = i.ToString();
Thread.Sleep(1000);
Application.DoEvents();
}
}));
this.Invoke(new Action(() =>
{
//Thread.Sleep(1005);
TXT_BeginInvoke.Text = 100.ToString();
Thread.Sleep(1005);
}));
}
}