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);
                    }));

猜你喜欢

转载自blog.csdn.net/weixin_44568736/article/details/122713426