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