Invoke:在拥有此控件的句柄窗口所在线程执行
BeginInvoke:在创建此空间的句柄窗口所在的线程上异步执行
简单点理解Invoke同步,BeginInvoke异步
(看半天,我就理解了就是个回主线程刷新UI?它不就是我们OC里dispatch_sync(dispatch_get_main_queue(), ),performSelectorOnMainThread,[[NSOperationQueue mainQueue] addOperationWithBlock:
这玩意吗)
何为同步何为异步,想必大家都比较清楚了
直接demo说话吧
首先开辟了一个线程
Thread t = new Thread(ThreadTest);
t.Start();
MessageBox.Show("main ID:" + Thread.CurrentThread.ManagedThreadId);
线程的执行方法
private void ThreadTest()
{
MessageBox.Show("thread ID:" + Thread.CurrentThread.ManagedThreadId);
Random r = new Random();
Thread.Sleep(2000);
// 可以理解成异步,不会阻塞当前线程,可以直接执行下面的messagebox。show方法
// 如果是Invoke,会阻塞当前开辟的线程,等执行结束才会show
BeginInvoke(new Action(() =>
{
// 回主线程刷新UI
Thread.Sleep(3000);// 睡3秒阻塞主线程,无论同步还是异步这个时候这3秒都会则塞主线程,因为已经回到主线程了
this.txtData.AppendText(r.Next(10, 100).ToString());
}));
//Thread.Sleep(10);
MessageBox.Show("========");
}
运行可知道,test方法与show mainID他们执行不分前后,因为一个是主线程一个是子线程嘛
意义不大,聊重点
- 如果使用Invoke也就是说同步嘛,当执行线程
ThreadTest
方法时先睡2秒,然后进入Invoke回到主线程在睡3秒,再去刷新UI,刷新完才会去执行MessageBox.Show("========");
- 如果使用BeginInvoke异步,区别就是,在子线程
ThreadTest
方法中睡完2秒直接就执行BeginInvoke,在执行MessageBox.Show("========");
此时他不会等到BeginInvoke内部执行完以后再去执行MessageBox.Show("========");
在者还有会有BeginInvoke执行结束回调,大家可自行研究测试BeginInvoke() AsyncCallback
作为它的参数,可以实现回调方法。
如理解有误还望大家指点,谢谢