正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是...
1、Invoke() 的使用会暂停当前的主线程,直到方法执行完毕并返回,这体现了其“同步”的特性。2、相对地,BeginInvoke() 则会在当前线程空闲时,利用线程池中的线程来执行方法,它不会阻止主线程的运行,而是等主线程处理完当前任务后再执行,这表现了“异步”的特性。若要获取BeginInvoke()的执行结果,...
Invoke:在同一线程上同步执行。BeginInvoke:在线程池线程上异步执行。Control.Invoke:在UI线程上执行,但...
1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。 2、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概...
Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行 (一)、Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。
(1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 (2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。 我们以代码(一)来看(Control的Invoke) private delegate void InvokeDelegate(); ...
Control.Invoke()和Control.BeginInvoke()的区别在于, BeginInvoke()会在 GUI 线程上安排异步操作。当异步操作被安排后,您的代码将继续执行。一段时间之后(您不知道确切的时间),您的异步操作将被执行。 Invoke()将在 GUI 线程上执行您的异步操作并等待直到操作完成。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过Invoke或者BeginInvoke去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使UI线程的负担不至于太大而已,因为界面的正确更新始终要通过UI线程去做,我们要做的事情是在工作线程中...
区别在于Invoke是同步,BeginInvoke是异步。打个比方(伪代码),后台线程中需要通知UI界面进行刷新 new Thread(){ /* 比如读取数据库的方法,比较耗时; var data = GetData(); 读取完成后通知UI线程, this.Invoke(data); //如果GetData方法是同步方法,则用Invoke回调 //this.BeginInvoke(...