Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。
一:如(Control的Invoke)
private delegate void InvokeDelegate();
private void InvokeMethod(){
Console.WriteLine("3...");
}
private void butInvoke_Click(object sender, EventArgs e) {
Console.WriteLine("1...");
this.Invoke(new InvokeDelegate(InvokeMethod));
Console.WriteLine("2...");
}
执行顺序是1 3 2 表示顺序执行
如果将Invoke改为BeginInvoke则执行顺序为 1 2 3
敲黑板:记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上,
Control的Invoke和BeginInvoke的委托方法是在主线程,即UI线程上执行的。也就是说如果你的委托方法用来取花费时间长的数据,然后更新界面什么的,千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死。
private Thread beginInvokeThread;
private delegate void beginInvokeDelegate();
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("1...");
beginInvokeThread = new Thread(new ThreadStart(StartMethod));
beginInvokeThread.Start();
Console.WriteLine("2...");
}
private void StartMethod()
{
Console.WriteLine("3...");
Thread.Sleep(2000);
this.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
Console.WriteLine("5...");
Thread.Sleep(2000);
}
private void beginInvokeMethod()
{
Console.WriteLine("4...");
//Thread.Sleep(2000);
}
如上代码表示在StartMethod中异步执行了beginInvokeMethod (如果在beginInvokeMethod执行耗时操作会造成UI卡死)
则执行顺序是 1 2 3 5 4 将 异步改为同步则是 1 2 3 4 5
二:(delegate的Invoke)
delegate void LugsTest(); static void Main(string[] args) { LugsTest lt = new LugsTest(ThreadSleep); lt.Invoke(); // 3s 后才打印 //lt.BeginInvoke(null, null); //立即打印 Console.WriteLine("LugsTest()"); Console.ReadKey(); } static void ThreadSleep() { Thread.Sleep(3000); }
两者的区别就是:
Invoke 是在主线程中执行,BeginInvoke 是另开一个线程执行。