日期:2014-05-17  浏览次数:21214 次

执行异步委托!!界面卡死的理论问题!!!请教各位!!!!!!
我的程序是这样的,在我点击界面上按钮后,执行如下的异步委托:
this.BeginInvoke(new go(toF));

其中“toF”的方法中有操作UI控件的。所以用this.BeginInvoke来执行。

但遇到问题是,我用UI的线程来执行toF,那么UI会卡死。但如果不用this.BeginInvoke来执行,那么又不可以跨线程安全操作UI控件。

问题1是:我已经用异步BeginInvoke了而不是用Invoke同步,为什么UI还会卡死?异步也阻塞吗?

问题2:.NET工具栏的自身的控件是怎么做到不卡死UI界面的?比如listBox这控件,在listBox.Items.Add()的时候界面也是很顺畅的???

------解决方案--------------------
(1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。
(2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。
------解决方案--------------------
toF是主线程函数,肯定要阻塞
------解决方案--------------------
1.BeginInvoke和Invoke只用在非UI线程中
2.BeginInvoke和Invoke跟阻不阻塞UI线程没关系,是相对于子线程的,前者不阻塞子线程,后者阻塞子线程(这里的子线程是指调用this.Invoke和this.BeginInvoke的线程)
3.如果你大量操作UI界面,BeginInvoke和Invoke也解决不了界面卡的问题,它两只能解决跨线程访问控件的问题。

BeginInvoke和Invoke跟界面卡不卡没有任何关系,这儿的异步是针对子线程而言的。

参见 http://bbs.csdn.net/topics/390528065  #8

------解决方案--------------------
1.看看这篇文章:Invoke 和 BeginInvoke 的真正涵义
2.一定要把运算时间长的代码放在工作线程中而非UI线程。