paopao_426 2015-04-14 08:52 采纳率: 100%
浏览 1766

委托的一点疑惑。为何此处仍然报线程不安全的异常【图】

我对委托的理解是一个函数指针,将某个方法的指针交给一个委托,然后由委托根据指针找到创建方法的线程去安全的调用方法。
疑问1:异步委托是否新开线程了。
疑问2:
当用子线程更新主线程控件状态时考虑到线程安全性一般都这样做。

 1 ***某线程的方法里***
2 
3 this.Invoke(New Action(()=>{
4      lable1.Text="111";
5         }));
6 
7 ***某线程的方法里***

在winform里,按钮控件的点击事件是属于主线程的。所以效果都是同步的。因此当触发按钮的点击事件执行button1-click时并没有跨线程。所以更新控件直接赋值即可,不必用Invoke方式(按钮事件也是个委托,此处暂且不考虑委托对线程安全起到的作用,因为根本没跨线程)。
而在winform里,BackGroundWorker这个控件执行时就是跨线程的了,他会异步的执行操作,在操作完成时触发RunWorkerCompleted事件。使用时只要注册RunWorkerCompleted事件,在这个事件触发我的方法时直接给控件赋值即可,也不必用Invoke考虑线程安全性。这里我有点疑惑。之所以不必用Invoke,是否就是RunWorkerCompleted这个事件(也是个委托),以线程安全的方式调用的我的方法,所以不必在我的方法里用Invoke。
如果是,那为什么我自定义的这个情况就出错了。
图片说明

  • 写回答

4条回答 默认 最新

  • paopao_426 2015-04-14 08:53
    关注

    由于在线没有C币,所以难以悬赏。sorry

    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料