-->

C#跨线程操作控件

2020-04-26 14:37发布

问题:

为什么调试状态会报错“从不是创建控件“button”的线程访问它”:

1、为什么“开始执行(不调试)”不会报错,”开始调试“就会报错

2、既然“开始执行(不调试)”不会报错,那么使用这个窗体软件时,是不是可以忽略这个问题?忽略了会给我带来什么坏处?
3、为什么修改button的背景颜色,不会报错,修改其他属性会报错?

回答1:

  1. 应该是你有全局捕获异常的地方,不调试的情况下直接被捕获了;再者就是这个异常是非UI线程抛出的,非调试是根本看不到。后者原因比较大。
  2. 当然不能忽略,找到问题所在,修复它。
  3. 最好贴出来你的实际代码。

肯定是非UI线程去操作button导致的了(也许你使用了SynchronizationContext,但是部分逻辑没有覆盖到),解决途径就是把这部分操作委托给UI线程去做。



回答2:

其他线程访问UI线程创建的控件,这就是线程安全问题。解决的办法就是异步方式和设置CheckForIllegalCrossThreadCalls = false ;



回答3:

button1.Invoke((MethodInvoker)(()=>
{
    //这里写逻辑
}));


回答4:

改成异步调用就行了,这是winfrom程序常见的一个问题,如果用wpf的双向绑定就不会有这个问题



回答5:

子线程不能修改 主线程(UI线程)控件 。winfrom 规定 。没有为什么,
在其他语言也是一样, 比如安卓开发也是一样