C# 跨线程 跨窗体 子线程在窗体外类中控制主窗体控件

时间:2021-02-11 18:08:37

 

概述 :  C# 串口向下位机发送 命令.下位机返回的数据出发接受事件,在辅助线程上控制住窗体中的控件!

      1 声明委托 ,属性通过属性控制控件

       2 主窗体 实例化 外部类时传入 this

      3  外部类中 方法实现 对出窗体的属性赋值.

      4 请使用 Invoke 回发更改请求   frmmain.Invoke(deleuid,UID);

 

  public event SerialPortDataReceiveEventArgs DataReceived;//串口接收事件在子线程上进行详细见

SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。 由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。 如果有必要修改主 FormControl 中的元素,请使用 Invoke 回发更改请求,这将在正确的线程上执行。(参考MSDN)

 

进入正题

主窗体代码 :声明委托 ,属性 通过属性来赋值 实例化xtcmds类时讲this传入

 

 public delegate void deleReturnUID(string UID);
    public partial class frmMain
    {

        public string UID
        {
            get { return txt_uid.Text; }
            set
            {
                txt_uid.Text = value;
            }
        }
    }
   private void btn_Check_Click(object sender, EventArgs e)
        {
            xt.common.xtcmd xcmd = new xt.common.xtcmd(this);
            xcmd.CMD_GEEUID();

       }

 

 

 

 

 

xtcmd.cs中的代码

 

 

1 构造函数 通过构造函数将主窗体的对象付给xtcmd类

       frmMain frmmain;
        public xtcmd(frmMain fm)
        {
            frmmain = fm;
            Comx.DataReceived += new Comhelp.SerialPortDataReceiveEventArgs(Comx_DataReceived);
        }

 

    接收事件内 处理接收到的数据
        void ReceiveInfoHandel(string Str)
        {
            if (Str.Substring(0, 4) == "4$$$")
            {
                string UID = Str.Substring(4, 8);
                XT.Drivinglicense.deleReturnUID deleuid;
                deleuid = SetUID;
                frmmain.Invoke(deleuid,UID);
            }
        }

 

        void SetUID(string uid)
        {
            frmmain.UID = uid;//这里可以直接饮用主窗体的对象 赋值即可
        }