invoke 界面冻结问题

he717 2009-09-09 08:40:19
BeginInvoke可以异步执行,窗口不冻结。而Invoke则冻结窗口,这可如何是好。我是做移动开发的,.net cf里BeginInvoke不能用,在网上看了一个UISafeInvoker的文章,但没找到源码。望高手指点!
...全文
84 点赞 收藏 11
写回复
11 条回复
he717 2009年09月09日
BeginInvoke在cf里可以“点儿”出来,但执行就报错。所以不能用。
我用Invoke是在一个线程里,执行的过程是要在界面上画很多的东西,大概需要好几秒的时间。这样窗口就冻结了好几秒。但是,如果不用Invoke,在线程里画图就会报错的。
现在唯一的办法就是在绘图过程中加Application.DoEvents()。不过这种方法好像有些牵强。是不是要等cf升级了才能支持呀,郁闷中。。。
回复 点赞
longmencdw 2009年09月09日
BeginInvoke在.net cf中是支持的吧?
回复 点赞
zhujiechang 2009年09月09日
invoke表示要回到调用invoke的线程去执行你的函数,如果你使用ui对象进行invoke,拿UI线程就会停下来做那个函数的事情,你的函数应该放在其他线程中执行,invoke在UI线程中的应该仅仅是需要呈现的结果信息函数而已。
回复 点赞
天乐_那由他 2009年09月09日
支持线程就可以啊,BeginInvoke也只是一种线程的异步执行模式罢了,可以自己实现
回复 点赞
love_cloud 2009年09月09日
mark
回复 点赞
tigerii 2009年09月09日
In main thread, you must use Application.DoEvents() to waiting the result of sub-threads when you call invoke in sub-threads. otherwise you will hang the UI.
回复 点赞
开心眼镜猴 2009年09月09日
Invoke的委托当中的实现放在一个子线程里去做就可以了
回复 点赞
mdmzl 2009年09月09日
学习.
回复 点赞
边城的刀声 2009年09月09日
对,用线程加事件
回复 点赞
tangyong12 2009年09月09日
放在线程里试试
回复 点赞
tigerii 2009年09月09日
Application.DoEvents()是必须的,不是牵强,因为Invoke就是在UI线程内执行,如果不用Application.DoEvents(),UI线程的消息循环就停止了。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告