C#中关于InvokeRequired 属性 与Invoke方法

2023-11-15

C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它

Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性 。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。

首先定义一个委托,与这个事件处理函数的签名一样委托,当然直接使用该事件的委托也是可以的,如:

 

 private   delegate   void  InvokeCallback( string  msg);

然后就是判断这个属性的值来决定是否要调用Invoke函数:

 

 void  m_comm_MessageEvent( string  msg)

    {

     if (txtMessage.InvokeRequired)

     {

     InvokeCallbackmsgCallback  =   new  InvokeCallback(m_comm_MessageEvent);

     txtMessage.Invoke(msgCallback,  new   object []  { msg } );

    } 

     else 

     {

     txtMessage.Text  =  msg;

    } 

   }

 

 

以下是个人的另一种实现方法:

 

调用机制代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public static class FormUtils

{

    public static void InvokeDele(this Control sender, Action<DeleArgs> action, DeleArgs args)

    {

        if (sender.InvokeRequired)

        {

            sender.Invoke(action, args);

        }

        else

            action(args);

    }

}

 

//参数类

public class DeleArgs : EventArgs

{

    public DeleArgs(object[] args)

    {

        Args = args;

    }

    public object[] Args { getset; }

}

  

窗体中的调用示例:

1

2

3

4

5

6

7

8

9

Action<DeleArgs> action = new Action<DeleArgs>(args =>

          {

              object parm1 = (object)args.Args[0];

              string parm2 = (string)args.Args[1];

  ...

          });

          DeleArgs arg = new DeleArgs(new object[] { parmVal1, parmVal2 });

 

          FormUtils.InvokeDele(this, action, arg);

  方法2:

调用机制:

1

2

3

4

5

6

7

public static void InvokeMethod(this Control control, Delegate action, params object[] args)

        {

            if (control.InvokeRequired)

                control.Invoke(action, args);

            else

                action.DynamicInvoke(args);

        }

  调用:

1

this.InvokeMethod(new DeleRefreshFilter(FilterFlightDatas), p.strfilter, p.isFilter, p.isFlag);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中关于InvokeRequired 属性 与Invoke方法 的相关文章

  • c++基础知识点-文件的创建,写入与读取(VS )

    用C 创建文件并且进行对文件的写入和读取操作 1 文件的创建 我用的软件是VS FILE fp1 fp2 errno t err err fopen s fp1 D privacy key txt wb if err 0 printf th
  • 未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)

    ICode联盟 项目中 App Code 文件夹中的类的命名空间 在添加的页面的 using XXXX 时 提示 未能找到类型或命名空间名称 XXXX 是否缺少 using 指令或程序集引用 说明要引用的这个类文件的 生成操作 属性没有选择
  • 头文件包含顺序不当引起错误

    昨天在写bug 不是 代码时 在编译的时候出现了 非法标记 与 语法错误 的报错 而且报错位置是一个不知道在哪个角落的文件 这种其他文件里的错误总是出现的莫名其妙 而且又是编译错误 调试也没法调试 看的脑壳疼 我起初以为是代码里的问题 于是
  • Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.Convert'

    类似于Missing compiler required member Microsoft CSharp RuntimeBinder Binder Convert 的异常 一般都是没有引用程序集Microsoft CSharp dll 引用
  • VS+QT新建项目显示无法找到ui_XX.h头文件的解决方法

    问题出现原因 在 VS 下 右键 ui 文件 gt 编译 会生成对应的 ui XX h 头文件 但默认的 ui XXX h 输出目录是 IntDir uic RelativeDir 在工程所在的 Debug uic 目录下 但错误显示找不到
  • VS2017评估期已过的处理方法

    Visual Studio 2017 VS2017 企业版 Enterprise 注册码 NJVYC BMHX2 G77MM 4XJMR 6Q8QF Visual Studio 2017 VS2017 专业版Professional 激活码
  • C/C++堆溢出(stack overflow)的解决

    问题 堆溢出 stack overflow 解决 1 在VS里面设置 属性 链接器 系统 堆栈保留大小 2 通过代码 第一个值是堆栈的保留空间 第二个值是堆栈开始时提交的物理内存大小 堆栈改变为100M pragma comment lin
  • opencv基础-环境配置&官方文档&源码编译

    opencv环境配置 官方文档 源码编译 前言 一 官方下载网址 二 官方文档地址 三 安装教程 1 包下载 2 环境配置 1 为什么要配置环境 2 环境变量 3 系统环境 四 配置vs工程环境 vs2019 opencv4 6 0 1 v
  • VS工程的3个基本文件

    VS的工程根目录下有3个文件 这3个文件都可以用记事本打开 其中 1 MyTest sln 工程主文件 含属性设置 工程从该文件打开 工程的主要属性设置在该文件中 2 MyTest filters 工程目录结构筛选器 工程的目录结构保存在这
  • vs2017 找不到源文件stdio.h解决方法

    这个问题网上又不少人提出 我的vs出现这个问题是因为我电脑重装系统了 原来的项目所采用windows SDK 已经发生了变化 因此解决的办法是 项目 gt 属性 gt 配置属性 gt 常规 gt windows SDK版本 将其换成你现在的
  • 目的:VSCode Remote-SSH连接远程失败timeout

    目的 VSCode Remote SSH连接远程失败timeout 环境 系统 win10 环境 VSCode 1 51 1 问题分析 正常使用VSCode的情况下 突然发现 解决步骤 判断可能是ssh问题 cmd打开控制台或者进入wind
  • 手把手教你SQLite在Windows/VS下的安装配置及使用(超详细,不会你怪我)

    目录 一 系统环境 二 下载 三 配置系统环境 四 使用命令win r 输入cmd命令 一 系统环境 我这里用的是 Win10 64Bit VS2015 不同版本相差不大 其版本也可以参考这个安装教程 二 下载 SQLite的官网下载地址
  • 修改Nuget缓存包下载路径

    一 打开NuGet config文件 该文件通常在C Users Username AppData Roaming NuGet下 二 添加设置 添加设置 value值设置为自己想要的路径
  • vs2017编译FFMPEG

    首先要建立至少两级目录 比如F ShiftMediaProject code 然后到code底下clone https github com ShiftMediaProject FFmpeg 代码到F ShiftMediaProject c
  • VS中使用动态库

    VS中使用动态库 一 将DLL头文件添加到包含路径 属性 gt C C gt 常规 gt 附加包含目录 二 将DLL导入库添加到项目中 1 添加附加库目录 属性 gt 链接器 gt 常规 gt 附加库目录 2 添加附加依赖项 这一步骤 也可
  • 【Visual Studio】调试过程中VS卡死无响应

    最近在使用vs2022 debug调试过程中 经常出现vs2022直接卡死无响应 解决方案 第一种原因 是加载符号导致 调试 选项 符号 1 取消勾选 xxx 符号服务器 2 选择 仅加载指定的模块 第二种情况 VS卡死后 把崩溃dmp导出
  • C#中关于InvokeRequired 属性 与Invoke方法

    C 中禁止跨线程直接访问控件 InvokeRequired是为了解决这个问题而产生的 当一个控件的InvokeRequired属性值为真时 说明有一个创建它以外的线程想访问它 Windows 窗体中的控件被绑定到特定的线程 不具备线程安全性
  • vs调试问题:error LNK1112编译器位数配置问题

    编译环境为 pcl1 8 vs2013 代码实现点云数据的相关处理 在编译的时候出现如下错误 error LNK1112 module machine type X86 conflicts with target machine type
  • VisualStudio(2022)- 打包项目文件为.exe安装包

    目录 前言 一 安装扩展 二 制作安装包 setup文件 2 1 添加setup项目 2 2 配置setup项目 2 3 添加项目文件到setup项目中 扩展知识 三个文件夹说明 2 4 设置项目主输出 2 5 设置快捷方式 2 6 生成安
  • Qt中SQLite3的增、删、改、查操作

    QT sqlite3 先说一下QT自带数据库sqlite3和另外用sqlite3插件的区别 他们的功能是一样的 但是代码就不一样了 QT对数据库具有完善的支持 不需要加任何其他插件就可以直接使用 但是如果你要是加了sqlite3插件 调用数

随机推荐

  • 用 AI 轻松管理数据收集和分布! #TallyForms

    工作中需要面对各种各样让人眼花缭乱的表格 此时一款让数据收集和整理变得轻松的平台简直就是打工人们的福音 TallyForms 就拥有自定义表单 实时分析和高效管理的全方位解决方案 TallyForms TallyForms 是一个免费的在线
  • 如何去掉去掉VC++的安全警告提示

    在用Vc进行进程编写时 你有可能会遇到一大堆的警告 warning C4996 如 warning C4996 This function or variable may be unsafe 原因是VC使用了更加安全的run time li
  • 【华为OD机试python】补种未成活胡杨【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 近些年来 我国防沙治沙取得显著成果 某沙漠新种植N棵胡杨 编号1 N 排成一排 一个月后 有M棵胡杨未能成活 现可补种胡杨K棵 请问如何补种 只能补种 不能新种 可以
  • [论文阅读] (01) 拿什么来拯救我的拖延症?初学者如何提升编程兴趣及LATEX入门详解

    又是在凌晨三点赶作业 又是在Deadline前去熬夜 一次次无眠 一次次抱怨 为什么三年前 两年前 一年前 甚至是昨天 我都下定决心 从现在开始读顶会论文 却又悄悄选择逃避 为什么我的收藏夹存了很多学习资料和视频 然而却没有再次翻起 为什么
  • linux快捷命令行

    对于程序员 经常要跟linux打交道 想想 每一行linux命令行省下那么一点点时间 一年下来省下的时间将可以 避免一个项目的delay 陪老婆去度一次蜜月 陪孩子去一次迪士尼 当然 首先你得有对象 接下来直接进入主题 首先我输入了一段自我
  • java怎么完成输出语句

    我们在前面的文章和案例中 其实早就知道Java是如何实现输出功能的了 没错 就是利用System out println 语句来实现的 接下来壹哥就给大家详细解读一下这个语句的作用及其含义 1 System 我们先来看看System是个什么
  • 为什么要使用MQ消息中间件?这几个问题必须拿下!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 这篇文章开始 我们把消息中间件这块高频的面试题给大家说一下 也会涵盖一些MQ中间件常见的技术问题 假如面试官看你简历里写了MQ中间件的使用经验 很可能会有如下问题 你
  • 安装Node.js (基于Ubuntu 20.04)

    文章目录 前言 方式一 从默认仓库安装 安装 需要权限 但是 但是 但是 方式二 从PPA NodeSource 安装 方式三 使用Node管理工具安装 nvm 前言 JavaScript 是 Web 开发中的主流语言 开发者一直的将其应用
  • java按钮数组_Java按钮控件数组实现计算器界面

    编写程序 通过按钮数组来管理界面中的所有按钮控件 从而使用最少的代码实现模拟的计算器界面 思路如下 创建一个类 通过extends使其继承窗体类JFrame 创建一个JFrame对象 使用JFrame类的setVisible 方法设置窗体可
  • 【LeetCode刷题】219 存在重复元素2

    题目 给你一个整数数组 nums 和一个整数 k 判断数组中是否存在两个 不同的索引 i 和 j 满足 nums i nums j 且 abs i j lt k 如果存在 返回 true 否则 返回 false 示例 class Solut
  • Dynamic Key-Value Memory Networks for knowledge Tracing

    Dynamic Key Value Memory Networks for knowledge Tracing Memory Augmented Neural Networks MANN text MANN MANN是一种用于多种NLP任务
  • nginx做反向代理报错peer closed connection in SSL handshake while SSL handshaking to upstream

    目录 一 具体报错 一 背景简述 二 其他说明 二 分析和解决 一 配置域名访问反向代理未解决 二 配置proxy ssl server name解决 一 具体报错 一 背景简述 有个业务系统A部署在云上 由于某种原因需要用到nginx反向
  • 处理textarea换行问题

    大家做前端的时候 相信都遇到过 利用多行文本控件 textarea 录入数据 多段落回车换行 但是在页面展示时 换行就不出效果了 有什么办法可以解决呢 下面给大家介绍两种个人觉得最简单的方法 一 JS替换法
  • 【新版】系统架构设计师 - 软件架构设计<轻量级架构>

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 架构 软件架构设计 轻量级架构 考点摘要 轻量级架构 表示层 业务逻辑层 持久层 数据库 SSH与SSM ORM Hibernate与Mybatis 架构 软件架构设计 轻量级架构 考点摘要
  • csdn个人首页变了

    csdn是不是要换个人首页样式了 怎么变了后又变回来了
  • 如何快速选择合适的模型和prompt,langchain来帮你

    构建您的语言模型应用程序可能需要在多种提示 模型甚至Chain 这是Langchain的概念 之间进行选择 在这个过程中 您需要以简单 灵活且直观的方式比较不同选项在不同输入上的表现 LangChain提供了一个名为ModelLaborat
  • 微信小程序云端函数报错解决方案

    VM4174 1 thirdScriptError errCode 1 errMsg Cloud API isn t enabled please call wx cloud init first 请先调用 wx cloud init 完成
  • AIGC将颠覆设计界?!今晚直播间解密AIGC之图像生成史

    从DeepFake 风格迁移到 Midjourney DALL E AIGC的应用一次又一次带给我们惊喜 这些背后的蕴藏着哪些原理 赶快加入AIGC图像生成直播课 探索AI生成艺术的奥秘 2月28日 3月7日每周二晚8点 系列直播课 扫码报
  • c++如何创建项目

    C 是一门广泛应用于计算机科学领域的编程语言 它能够实现高效的程序编写和性能优化 在开始C 编程之前 我们需要创建一个新的项目来存储我们的代码和资源文件 本文将详细介绍如何在各个平台上使用不同的IDE 集成开发环境 创建C 项目 1 在Wi
  • C#中关于InvokeRequired 属性 与Invoke方法

    C 中禁止跨线程直接访问控件 InvokeRequired是为了解决这个问题而产生的 当一个控件的InvokeRequired属性值为真时 说明有一个创建它以外的线程想访问它 Windows 窗体中的控件被绑定到特定的线程 不具备线程安全性