求教帖,跨线程跨类更新UI
vb.net吧
全部回复
仅看楼主
level 3
格姊情缘
楼主
一个主窗体,窗体上有一个Button,想通过委托实现类里面的独立线程来更新主窗体的UI。但是现在总是提示线程间操作无效,求教
2017年09月05日 02点09分
1
level 3
格姊情缘
楼主
2017年09月05日 02点09分
2
110schoolx
在窗体Load事件里加这么一句就好了CheckForIllegalCrossThreadCalls = false
2017年09月09日 23点09分
110schoolx
你这个应该是多线程处理出现这个问题。不过加上上面这句尽管一般不会有什么问题,但是遇到两个线程操作同一个控件可能导致控件奔溃,请用SyncLock来防止多个线程操作同一个控件。最后,还有一种非常安全的办法。用委托函数invoke进行操作,这样才是线程安全的。
2017年09月09日 23点09分
110schoolx
各有各的好处,自己看着办吧。invoke是安全的,但是如果是主进程invoke一来多很多代码,二来因为invoke实际上还是将操作返回了主线程,如果这个操作耗时比较多的话,还是会导致主线程假死。像改text这种操作,直接加上那句不检查线程间非法操作就行可以了。这个还能从异常设置中关闭。
2017年09月09日 23点09分
ivbscript
@110schoolx
我觉得还是不检查控件跨线程方便。
2017年09月20日 13点09分
level 6
青花恶魔
UI必须在创建UI的线程更改,其他线程不能修改UI
2017年09月05日 03点09分
3
格姊情缘
请教一下这个怎么可以实现呢?
2017年09月05日 04点09分
level 7
枫飞铃兰
委托
2017年09月05日 04点09分
4
格姊情缘
我在网上也是查到说要用委托,但是现在也是实现不了,不知道为什么?求指点
2017年09月05日 04点09分
level 7
sowo
委托是指控件.invoke方法
2017年09月05日 10点09分
5
格姊情缘
现在就是不知道用哪个控件调用invoke方法,用form1的话会出现如下错误。在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
2017年09月05日 10点09分
格姊情缘
还望指点一二
2017年09月05日 10点09分
sowo
@格姊情缘
假设在线程a上改控件文本,线程a上执行控件.invoke(sub() 控件.text="abc")
2017年09月05日 10点09分
格姊情缘
@sowo
好的,多谢!
2017年09月05日 11点09分
level 6
青花恶魔
答案在这张图的某个链接里
2017年09月05日 12点09分
6
level 8
超越理想2001
试试在窗体的Load事件中加一句CheckForIllegalCrossThreadCalls=False
2017年09月10日 01点09分
7
青花恶魔
严重不推荐这种做法
2017年09月19日 23点09分
110schoolx
@青花恶魔
一般不会出问题的,特别是自己写的小程序,但是程序复杂了就很容易出问题
2017年09月20日 22点09分
level 10
二笔青年🐷
2017年09月10日 11点09分
8
level 8
jimmyfluore
现在的标准写法是这样
Me.Invoke(Sub()
Button1.Text="Lambda"
End Sub)
2017年09月28日 00点09分
9
level 9
TERA_ARISU
挖个坟,昨天碰到同样的问题,搜了老半天终于找到解决方法。
类实例化的时候把Form1传进去,然后再用委托就可以了。
2017年10月21日 09点10分
10
1