当前位置: 首页 > article >正文

WinForm中的Invoke函数

文章目录

    • 同步Invoke
      • 函数原型
      • 使用该函数
    • 异步Invoke
      • 函数原型(异步执行)
      • 调用此函数
    • 带方法Invoke
      • 函数原型是
      • 使用该函数

最近在处理相机串口SerialPort与Winform的窗口展示获取数据的相关内容,为了展示串口数据,必须要进行Invoke调用。

同步Invoke

函数原型

该函数的原型是:
在这里插入图片描述

使用该函数

针对Form中的特定组件对象,需要进行操作。
经尝试,这个可以在串口SerialPort的处理函数中调用。
当没有参数时:

public delegate void SetModeDisplay();
private void SetModle()
{
    if (this.txtModelType.InvokeRequired)
    {
        SetModeDisplay d = new SetModeDisplay(SetModle);
        this.Invoke(d, new object[] { });
    }
    else
    {
        // 需要执行的业务代码(例如)
        this.txtModelType.Text = "今日宜WLB!";
        this.txtModelType.BackColor = Color.DarkSeaGreen;
    }
}

异步Invoke

函数原型(异步执行)

在这里插入图片描述

调用此函数

针对Form中的特定组件对象,需要进行操作。
经尝试,这个可以在串口SerialPort的处理函数中调用。
当有一些参数时:

// 创建控件的线程上执行的函数类型
public delegate void FormInvokeDelegate(object clientHandle, string value);
/// <summary>
/// 在Form的对应位置控件显示结果
/// </summary>
/// <param name="clientHandle">控件对象</param>
/// <param name="value">结果</param>
private void DisplayOnForm(object clientHandle, string value)
{
    
     // We have to call an invoke method 
     if (this.InvokeRequired)
     {
         // Asynchronous execution of the FormInvokeDelegate delegate
         this.BeginInvoke(new FormInvokeDelegate(DisplayOnForm), clientHandle, value);
         return;
     }
     if (clientHandle.GetType() == typeof(TextBox))
     {
          // 需要执行的业务代码(例如)
          TextBox txtMonitoredValue = (TextBox)clientHandle;
          // The node succeeded - print the value as string
          txtMonitoredValue.Text = value;
          txtMonitoredValue.BackColor = Color.YellowGreen;
     }   
}

带方法Invoke

函数原型是

在这里插入图片描述

使用该函数

针对Form中的特定组件对象,需要进行操作。
(但是这里做了折中,因为不能直接传引用进去,所以使用了字典来完成name到组件对象的转换。那么不做转换行么?)。
经尝试,这个可以在串口SerialPort的处理函数中调用。
当包含多个参数时:

private Dictionary<string, object> name2Obj= new Dictionary<string, object>
{
     ["txtACamReceive"] = txtACamReceive,
     ["txtACamHB"] = txtACamHB,
     ["txtBCamReceive"] = txtBCamReceive,
     ["txtBCamHB"] = txtBCamHB,
 };
/// <summary>
/// 从串口收到的信息添加到文本框
/// </summary>
/// <param name="text">信息</param>
/// <param name="name">文本框名</param>
/// <param name="isAppend">添加还是覆盖?</param>
private void SetCamRecv(string text, string name, bool isAppend = false)
{
    if (string.IsNullOrEmpty(text = text.Trim())) return;
    if (this.InvokeRequired)
    {
        this.Invoke(((MethodInvoker)delegate {SetCamRecv(text, name, isAppend); }));
    }
    else
    {
        // 需要执行的业务代码(例如)
        if (isAppend)
            ((RichTextBox)name2Obj[name]).Text = $"[{DateTime.Now:MM-dd HH:mm:ss}]{text}\n{((RichTextBox)name2Obj[name]).Text}";
        else
            ((TextBox)name2Obj[name]).Text = text;
    }
}

http://www.kler.cn/a/560230.html

相关文章:

  • Dify工具的安装和使用
  • 【AIGC系列】1:自编码器(AutoEncoder, AE)
  • 使用自制工具类实现安全的密码加密与校验
  • Linux操作系统:基于Linux的入侵检测系统(IDS)研究与实践
  • Mysql 主从集群同步延迟问题怎么解决
  • 23种设计模式之《外观模式(Facade)》在c#中的应用及理解
  • 基于SpringBoot和Leaflet的邻省GDP可视化实战
  • WordPress TForce_Edition sql注入漏洞复现(CVE-2024-13478)(附脚本)
  • 游戏引擎学习第118天
  • maven模块化管理
  • PVE虚拟机解除locked(锁定状态)
  • Linux操作系统面试知识点总结
  • bat命令在b站下载单个音视频
  • 数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析
  • 电脑经常绿屏(蓝屏)怎么办(解决方法)?
  • 气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
  • Windows配置添加右键菜单——在VSCode中打开
  • 初级渗透测试工程师需要学什么?网络安全零基础入门到精通教程建议收藏!
  • 【MySQL】表的增删查改(CRUD)(上)
  • 从测试的角度评审需求时需要注意哪些事项?