WinForm中跨线程调用控件

winfrom中不允许直接跨线程调用控件的方法
例如 一个udp线程,一个Form窗口线程,希望通过接收的消息创建UI,但是udp线程直接调用Form里的创建UI控件的方法时,会报错

在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级。”

此时需要使用形如

  if (flowLayoutPanel_MachineType.InvokeRequired)
  {
        //跨线程调用
        flowLayoutPanel_MachineType.Invoke(new MethodInvoker(()=>
        {
            flowLayoutPanel_MachineType.Controls.Add(tempBtn);
        }));
  }
  else
  {
        //本线程调用
        flowLayoutPanel_MachineType.Controls.Add(tempBtn);
  }

并在窗口的构造函数里添加

        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

来解决报错的问题

flowLayoutPanel_MachineType.InvokeRequired的作用是区分本线程还是跨线程,当跨线程时InvokeRequired为true

flowLayoutPanel_MachineType.Invoke方法为跨线程调用的方法,参数为一个委托

new MethodInvoker 为一个 没有参数和返回值的方法,其构造参数为一个实例方法,这个实例方法可以用匿名委托或者一个lambda,两种写法分别为
lambda:

 flowLayoutPanel_MachineType.Invoke(new MethodInvoker(()=>
                    {
                      flowLayoutPanel_MachineType.Controls.Add(tempBtn);
                    }));

匿名函数

 flowLayoutPanel_MachineType.Invoke(new MethodInvoker(delegate
                    {
                      flowLayoutPanel_MachineType.Controls.Add(tempBtn);
                    }));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值