正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是...
1、Invoke() 的使用会暂停当前的主线程,直到方法执行完毕并返回,这体现了其“同步”的特性。2、相对地,BeginInvoke() 则会在当前线程空闲时,利用线程池中的线程来执行方法,它不会阻止主线程的运行,而是等主线程处理完当前任务后再执行,这表现了“异步”的特性。若要获取BeginInvoke()的执行结果,...
Invoke:在同一线程上同步执行。BeginInvoke:在线程池线程上异步执行。Control.Invoke:在UI线程上执行,但...
(一)Control的Invoke和BeginInvoke我们要基于以下认识:(1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。(2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。我们以代码(一)来看(Control的Invoke)private delegate void InvokeDelegate...
1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。 2、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概...
一、Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。但委托的内容在UI线程上执行。 Control.BeginInvoke 方法 (Delegate):在创建控件的基础句柄所在线程上异步执行指定委托。但委托的内容在UI线程上执行。
Control.Invoke()和Control.BeginInvoke()的区别在于, BeginInvoke()会在 GUI 线程上安排异步操作。当异步操作被安排后,您的代码将继续执行。一段时间之后(您不知道确切的时间),您的异步操作将被执行。 Invoke()将在 GUI 线程上执行您的异步操作并等待直到操作完成。
异步是指相对于调用BeginInvoke的线程异步,而不是相对于UI线程异步,你在UI线程上调用BeginInvoke,当然不行了。---摘自"Invoke和BeginInvoke的真正涵义"一文中的评论。 BeginInvoke的原理是将调用的方法Marshal成消息,然后调用Win32 API中的RegisterWindowMessage()向UI窗口发送消息。---摘自"Invoke和BeginInvoke的真正涵义"...
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过Invoke或者BeginInvoke去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使UI线程的负担不至于太大而已,因为界面的正确更新始终要通过UI线程去做,我们要做的事情是在工作线程中...