C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全,你可以这样理解,有人想找你借钱,他可以直接在你的钱包中拿,这样太不安全,因此必须让别人先要告诉你,你再从自己的钱包把钱拿出来借给别人,这样就安全了------------------------------------------------------------------------在设计中为了让界面与逻辑分离,我的做法是使用事件,界面只要响应事件来处理界面的显示就行了。而事件在逻辑处理中可能由不同的线程引发,这些事件的响应方法在修改界面中的控件内容时便会引发一个异常。这时就用到了Control.InvokeRequired 属性 与Invoke方法。------------------------------------------------------------------------获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性 。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。------------------------------------------------------------------------首先定义一个委托,与这个事件处理函数的签名一样委托,当然直接使用该事件的委托也是可以的,如:private   delegate   void  InvokeCallback( string  msg);然后就是判断这个属性的值来决定是否要调用Invoke函数:void  m_comm_MessageEvent( string  msg){if (txtMessage.InvokeRequired){InvokeCallback msgCallback  =   new  InvokeCallback(m_comm_MessageEvent);txtMessage.Invoke(msgCallback,  new   object []  { msg } );} else {txtMessage.Text  =  msg;} }说明:这个函数就是事件处理函数,txtMessage是一个文本框。这样就做到了窗体中控件的线程安全性。------------------------------------------------------------------------InvokeRequired 当前线程不是创建控件的线程时为true比如你可以自己开一个Thread,或使用Timer的事件来访问窗体上的控件的时候,在线程中窗体的这个属性就是True的。简单的说,如果有两个线程,Thread A和Thread B,并且有一个Control c,是在Thread A里面new的。那么在Thread A里面运行的任何方法调用c.InvokeRequired都会返回false。相反,如果在Thread B里面运行的任何方法调用c.InvokeRequired都会返回true。是否是UI线程与结果无关。(通常Control所在的线程是UI线程,但是可以有例外)也可以认为,在new Control()的时候,control用一个变量记录下了当前线程,在调用InvokeRequired时,返回当前线程是否不等于new的时候记录下来的那个线程。

转载于:https://www.cnblogs.com/profession/p/4782202.html

InvokeRequired和Invoke相关推荐

  1. c# InvokeRequired和Invoke

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

  2. InvokeRequired and Invoke

    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired(v=VS.90).aspx 在. ...

  3. c# winform InvokeRequired 解决跨线程访问控件

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

  4. C# 多线程修改控件时遇到:创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

    一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate{btnRefresh.Enabled = true; ...

  5. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  6. [转载]分享WCF聊天程序--WCFChat

    http://www.cnblogs.com/gaoweipeng/archive/2009/09/04/1560260.html 无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:N ...

  7. [转]WinForm下Splash(启动画面)制作

    本文转自:http://www.smartgz.com/blog/Article/1088.asp 原文如下: 本代码可以依据主程序加载进度来显示Splash.     static class Pr ...

  8. C#做的在线升级小程序

    转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...

  9. c#中对Cross-thread operation not valid错误的处理办法

    目录 目录 概要 1. Example 1.1 Unsafe access to control 1.2 What's mean? 2. The first choice : CheckForIlle ...

  10. C# 实现基于ffmpeg加虹软的人脸识别

    2019独角兽企业重金招聘Python工程师标准>>> 关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人 ...

最新文章

  1. 福建农林大学朱方捷组招聘讲师/副教授/助理——生信分析方向
  2. JStorm与Storm源码分析(二)--任务分配,assignment
  3. c++ 浮点数转换成字符串_Python如何处理数据?如何把数据转换成我们想要的?三种处理方法...
  4. PE转换分区表格式为GPT
  5. 省带宽、耗电小,腾讯游戏学院专家解析手游渲染架构
  6. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)
  7. qdu_ACM集训队3月5号组队训练
  8. appium for java教程_appium自动化测试入门(java版)
  9. idea调试怎么跳出循环_IDEA调试技巧条件断点实现步骤详解
  10. python的os库_os库(python)—总结
  11. jQuery 自定义事件的学习笔记
  12. pandas python2_Python随笔 | Pandas入门(二)
  13. 没有期刊申请清华博士_ICLR飞升,IJCAI降级:清华的新版AI顶会评级引发学术圈热议...
  14. 【HDU-5963】朋友【树上博弈】
  15. Axure8.1.0.3389 授权码
  16. 单片机外围电路设计攻略
  17. linux上如何搭建Java环境
  18. 推背图预测新冠病毒来袭
  19. [HNOI2004]打鼹鼠 简单DP
  20. 嵌入式STM32深入之RTOS编程

热门文章

  1. java技术体系基础
  2. mybatis动态sql片段与分页,排序,传参的使用与一对多映射与resultMap使用
  3. vue-cli2.0webpack的理解
  4. umask 文件预设权限掩码
  5. 如何用atom编辑python_对于新手来说 如何用atom搭建python的ide?
  6. android写一个遥控器界面,遥控器界面软件的设计 - 基于安卓系统手机WiFi的家用智能遥控器开发...
  7. nodejs mysql 增删改查_#NodeJS# MySQL的介绍安装使用以及使用NodeJS链接MySQL实现增删改查...
  8. linux中安装mysql_Linux下安装MySQL
  9. 怎么修改HTML中样式的项目序号,给Ol的序号设置样式,怎么做?
  10. matlab出图时汉字都变成方框_Autodesk软件界面中文字都变成符号“方框”,怎么办呢?...