[WinForm]关于InvokeRequired与Invoke

2023-11-09

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

如果已经创建控件的句柄,则除了 InvokeRequired 属性以外,控件上还有四个可以从任何线程上安全调用的方法,它们是: Invoke、 BeginInvoke、 EndInvoke 和 CreateGraphics。 在后台线程上创建控件的句柄之前调用 CreateGraphics 可能会导致非法的跨线程调用。 对于所有其他方法调用,当从另一个线程进行调用时,应使用这些 Invoke 方法之一。

如果控件句柄尚不存在,则 InvokeRequired 沿控件的父级链搜索,直到它找到有窗口句柄的控件或窗体为止。 如果找不到合适的句柄, InvokeRequired 方法将返回 false。

这意味着如果不需要 Invoke(调用发生在同一线程上),或者如果控件是在另一个线程上创建的但尚未创建控件的句柄,则 InvokeRequired 可以返回 false。

如果尚未创建控件的句柄,您就不能简单地在控件上调用属性、方法或事件。这可能导致在后台线程上创建控件的句柄,从而隔离不带消息泵的线程上的控件并使应用程序不稳定。

当 InvokeRequired 在后台线程上返回 false 时,您也可以通过检查 IsHandleCreated 的值来避免这种情况。 如果尚未创建控件句柄,您必须等到控件句柄已创建,才能调用 Invoke 或 BeginInvoke。 通常,仅当在应用程序主窗体的构造函数中创建了后台线程时(如同在 Application.Run(new MainForm()) 中),在已经显示窗体或取消 Application.Run 之前,才会发生这种情况。

一种解决方案是等到已经创建了窗体的句柄,然后启动后台线程。通过调用 Handle 属性强制创建句柄,或者等待 Load 事件启动后台进程。

一种更好的解决方案是使用 SynchronizationContext 返回的 SynchronizationContext,而不是使用控件进行线程间封送处理。——MSDN

关于这方面一个更容易的解释以及例子(参考链接:关于invokeRequired与invoke):

image

 

而关于InvokeRequired与Invoke是个老生常谈的问题,一般标准写法为(图片截图来自:Avoiding InvokeRequired,下同):

image

这种方式的好处就是能在.NET 1.0+上正常运行,但是如果存在很多控件的话,就会存在这样很多代码(大量定义委托)。

而在.NET 2.0上,可以采用匿名委托和MethodInvoker,简化代码写法,关于MethodInvokerMSDN上的定义如下:

MethodInvoker 提供一个简单委托,该委托用于调用含 void 参数列表的方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。

image

或者更简洁的写法:

image

image

image

而在.NET 3.5+可以利用其特性,代码如下(截图来在:A Generic Method for Cross-thread Winforms Access

image

image

参考资料:

关于invokeRequired与invoke

Avoiding InvokeRequired

A Generic Method for Cross-thread Winforms Access

若有谬误,烦请告知,新手发帖请多包涵 微笑


<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[WinForm]关于InvokeRequired与Invoke 的相关文章

  • 2023-数仓建设规范指南

    一 数据模型架构原则 1 数仓分层原则 优秀可靠的数仓体系 往往需要清晰的数据分层结构 即要保证数据层的稳定又要屏蔽对下游的影响 并且要避免链路过长 那么问题来了 一直在讲数仓要分层 那数仓分几层最好 目前市场上主流的分层方式眼花缭乱 不过
  • MySQL中神奇的show命令详解

    show binary logs 列出服务器上的二进制日志文件 show binlog events 显示二进制日志中的事件 show character set 显示所有可用的字符集 show collation 列出服务器支持的排序规则
  • 全网最全的Postman接口自动化测试(史实级攻略)

    背景 该篇文章针对已经掌握 Postman 基本用法的读者 即对接口相关概念有一定了解 已经会使用 Postman 进行模拟请求的操作 当前环境 Window 7 64 Postman 版本 免费版 Chrome App v5 5 3 不同
  • Laravel项目线上服务器docker化部署实战全过程记录指导(转 2021-04-02)

    最近 笔者终于在重重困难之下 完成了自己的第一个laravel项目 有什么感受呢 当然就是laravel虽然体型大 但是功能也更全了 总起来说 是一个在php后端领域值得深入挖掘 日积月累的框架 项目的本地开发和测试都已经完成 那么接下来面
  • MySQL常用函数、关键字解析。

    目录 引言 一 数据库简介 二 SQL语句 三 MySQL常用函数 数学函数 日期函数 MySQL其他命令 四 Navicat快捷键 引言 暂时只想起来这些 有需要补充的或者文章内出现的错误欢迎指正 评论 or 私信 请努力提升自己 划重点
  • 一次另类的由kjournald日志进程引起的磁盘io问题的解决

    http www 5ilinux com 2012 11 kjournald io html 最近linode的服务器做cacti的监控测试 偶尔发现服务器最近几周的io成几何级增长 而同期的cpu负载却发现无太明显的几何级的增长 好在li
  • 电流电压双闭环PID控制以及C语言实现

    对于电流电压双闭环PID控制 我们需要先了解一下PID控制的原理 PID控制器是由比例 P 积分 I 和微分 D 三个部分组成的控制器 用于控制具有惯性和滞后响应的过程 PID控制器需要通过测量误差 计算出控制输出 以便实现系统稳定 在电流
  • Qt的QMessageBox消息弹窗

    Qt的消息弹窗QMessageBox Qt的消息弹窗QMessageBox 1 说明 2 6种消息框 3 QMessageBox StandardButton 枚举类型值 3 1 information消息对话框 3 1 1 informa
  • RabbitMQ 消息有效期问题

    目录 一 默认情况 二 TTL Time To Live I TTL 的简介 II 单条消息过期 III 队列消息过期 IV 特殊情况 三 死信队列以及死信交换机 I 死信交换机 II 死信队列 III 具体操作 一 默认情况 在默认情况下
  • html 模板

    模板王 10000 免费网页模板 网站模板下载大全 mobanwang com http www mobanwang com
  • IEEE Transactions模板中参考文献作者缩写、期刊名缩写

    IEEE Transactions模板中参考文献作者缩写 期刊名缩写 本文章记录如何在IEEE Transactions的模板中 解决参考文献的作者缩写 期刊名字缩写的问题 目录 IEEE Transactions模板中参考文献作者缩写 期
  • python爬虫一:爬虫简介

    1 什么是爬虫 络爬 被称为 蜘蛛 络机器 就是模拟客户端发送 络请求 接收请求响应 种按照 定的规则 动地抓取互联 信息的程序 只要是浏览器能做的事情 原则上 爬 都能够做 可见即可爬 1 1爬虫有哪些用途 为其他数据提供数据源 像AI人
  • 数据挖掘的特点

    数据挖掘具有以下几个特点 1 基于大量数据 并非说小数据量上就不可以进行挖掘 实际上大多数数据挖掘的算法都可以在小数据量上运行并得到结果 但是 一方面过小的数据量完全可以通过人工分析来总结规律 另一方面来说 小数据量常常无法反映出真实世界中
  • kettle运行spoon.bat时找不到javaw文件

    我也遇到这问题了 分享一下解决方法吧以后没准还有人能用到 我机器的主要问题是环境变量JAVA HOME的值不对 应该写到jdk也就是C Program Files Java jdk1 7 0 25 并且 改完后要重启机器才行 这个很重要
  • DNS服务器的安装与配置

    一 DNS服务器的安装 步骤1 选择 开始 控制面板 添加或删除程序 添加 删除Windows组件 然后选取 网络服务 组件 再单击详细信息按钮 步骤2 选取 域名系统 DNS 组件后单击 确定 按钮 步骤3 回到前一个画面后 单击 下一步
  • vscode远程开发及公钥配置(告别密码登录)

    文章目录 vscode远程开发及公钥配置 简介 关于远程开发官网简介 关于SSH简介 环境 插件安装 配置服务器 找到配置文件 修改配置文件 连接服务器 配置密钥 简介 密钥生成 服务器上安装公钥 查看或配置打开密钥登录功能 服务器私钥复制
  • SSL/TLS 双向认证(一) -- SSL/TLS 工作原理

    本文部分参考 https www wosign com faq faq2016 0309 03 htm https www wosign com faq faq2016 0309 04 htm http blog csdn net hher
  • 四川计算机专业高职高考,四川职高计算机专业分数线

    类似问题答案 2016年贵州大学计算机类专业在四川录取分数线 学校 地 区 专业 年份 批次 类型 分数 贵州大学 四川 计算机类 2016 一批 理科 597 学校 地 区 专业 年份 批次 类型 分数 贵州大学 四川 计算机类 2016
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 分布式数据库核心原理 Zookeeper+Mysql

    原文 作者 1菩提行者1 笔者一直做java开发 由于技术演进做过大型微服务项目 微服务即将一个大的服务拆分成一个一个小的微服务 每个微服务自成生态 而在落地过程中紧紧只是应用层拆分 数据层往往用同一个库 有点形变神不变 当然将微服务与其对

随机推荐

  • JavaScript如何截取指定位置的字符串

    我们在日常开发中 经常需要对字符串进行删除截取增加的操作 我们这次说一下使用JavaScript截取指定位置的字符串 一 使用slice 截取 slice 方法可以通过指定的开始和结束位置 提取字符串的某个部分 并以新的字符串返回被提取的部
  • MIPI介绍(CSI DSI接口)

    MIPI介绍 CSI DSI接口 MIPI介绍 CSI DSI接口 视频接口 2 MIPI Solution mipi接口 缘来是你远去是我的博客 CSDN博客 MIPI LVDS RGB HDMI等接口对比 mipi和lvds区别 芒果5
  • socket编程

    socket 可以看做用户进程与内核网络协议栈的编程接口 可以用于本机进程间 网络上不同主机进程间的通信 对等通信 是全双工的 socket 异构系统 所以需要统一字节序统一后的字节序为大端字节序 x86为小端字节序 字节序转换函数 可以看
  • vsCode插件安装之汉化和浏览器打开

    一 汉化的方法 点击最左面第五个图标 在搜索框里面输入Chinese 点击如图第一个内容 点击Install 安装 安装后 重启软件即可 二 浏览器打开html 文件方法 在安装插件窗口搜索Browser 点击如图内容 点击install安
  • SpringBoot(十)SpringBoot自定义starter

    一个月的时间 转眼已经到了我的SpringBoot系列的第十篇文章 还记得我的第二篇文章SpringBoot 二 starter介绍 springboot的starter heart荼毒的博客 CSDN博客 曾经介绍过starter sta
  • mmdetection训练自己的VOC数据集 label=self.cat2label 报错解决方案

    废话不多说 直接上报错的图 看了GitHub上的大佬的回答 报错的原因是self cat2label值不对 所以根据大佬的建议 我print了self cat2label值 发现果然不对 类还是VOC数据集的类 而不是我自己的类 我的类是
  • ARM下高效C编程

    通过一定的风格来编写 C 程序 可以帮助 C 编译器生成执行速度更快的 ARM 代码 下面就是一些与性能相关的关键点 1 对局部变量 函数参数和返回值要使用 signed 和 unsigned int 类型 这样可以避免类型转换 而且可高效
  • 猫狗数据集

    import numpy as npimport pickleimport cv2import pandas as pdimport tensorflow as tfimport matplotlib pyplot as plt mnist
  • 干货!如何用Python处理图像,一文带你了解!

    大家好 我是菜鸟哥 用Python玩图像处理还是很有意思的 我们以前写过很多这样的文章 学Python真香 我用100行代码做了个网站 帮人PS旅行图片 赚个鸡腿吃 十行代码 我用Python做一个迷你版的美图秀秀 十行Python代码替换
  • 【Kali】kali主要工具使用说明(文末附超全思维导图)

    本文为 从实践中学习Kali Linux渗透测试 总结笔记 仅供学习使用 禁止用于非法用途 转载请附上原文链接 1 信息收集 1 1 发现主机 traceroute 获取目标主机的路由条目 确定网络拓扑 每一跳表示一个网关 星号可能为防火墙
  • JAVA-面向对象

    面向对象编程与面向过程编程只是一种在思维方式上的划分 面向过程是以分步骤的方式解决问题 而面向对象是以分步骤的方式解决问题 面向对象的三大特性是 封装 继承 多态 封装 就是将客观事物封装成抽象的类 抽象类可以将自己的数据和方法只让自己信任
  • Kotlin中枚举

    一 写一个Kotlin的枚举 package net println kotlin chapter4 author wangdong description enum class LogLevel VERBOSE DEBUG INFO WA
  • 手语识别 机器学习_手语识别研究综述.PDF

    手语识别研究综述 PDF 第 7 卷第 3 期 信息技术快报 Vol 7 No 3 Information Technology Letter May 2009 手语识别研究综述 张良国 陈熙霖 摘 要 本文综述了手语识别领域近年来的研究热
  • 多个.C和.H文件的相互调用以及变量的跨文件使用

    假如 有一个头文件 1 h 和源文件1 c 还有一个头文件 2 h和源文件2 c 函数的调用 假如 有一个函数 在1 h 中声明 void xuexi void 在1 c中实现 先包含 include 1 h void xuexi void
  • Follow your heart(180)---tmd的 那些各种D文档

    我4月去杭州 找好友谈一起做的事情 她推荐了一个人加入 然后要我写什么PRD 我才知道 那叫产品需求文档 可是 我有啊 只是我直接就加了很多设计进去 不是完全把自己作为客户的 好友发了一个他们公司的PRD文档 那是一个非互联网产品的产品 是
  • 解决LoggerFactory is not a Logback LoggerEither remove Logback or the competing implementation (class

    一个项目引入了amqp以后报错 疑似包冲突 最后利用dependency analyzer终于解决了 问题 原依赖
  • 不知道如何入门Kotlin?《Android版kotlin协程入门进阶实战》带你从入门,带你飞

    作为一名 Android 开发者 掌握 Kotlin 语言对于职业发展具有重要意义 随着 Google 正式将 Kotlin 确立为 Android 开发的官方编程语言 Kotlin 的地位在 Android 开发领域迅速攀升 因此 仅仅依
  • linux系统输入指令,Linux系统基础 - 基本操作命令

    原标题 Linux系统基础 基本操作命令 首先介绍一个名词 控制台 console 它就是我们通常见到的使用字符操作界面的人机接口 例如dos 我们说控制台命令 就是指通过字符界面输入的可以操作系统的命令 例如dos命令就是控制台命令 我们
  • QRemoteObject在多进程间通讯的实现方法

    QRemoteObject是qt进程间通讯特有的方式 实现了在进程间通过信号槽的方式来编程的方式 省去了很多的麻烦 比如采用共享内存的方式 得考虑数据同步问题 用qt的方式去解决 才能体现qt的优势 通过分析 QRemoteObject底层
  • [WinForm]关于InvokeRequired与Invoke

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