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;

}

}

----以上为转载内容

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

调用机制代码:

    public static class FormUtils{public static void InvokeDele(this Control sender, Action<DeleArgs> action, DeleArgs args){if (sender.InvokeRequired){sender.Invoke(action, args);}elseaction(args);}}//参数类public class DeleArgs : EventArgs{public DeleArgs(object[] args){Args = args;}public object[] Args { get; set; }}

  

窗体中的调用示例:

  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:

调用机制:

public static void InvokeMethod(this Control control, Delegate action, params object[] args){if (control.InvokeRequired)control.Invoke(action, args);elseaction.DynamicInvoke(args);}

  调用:

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

  

转载于:https://www.cnblogs.com/EasyInvoice/p/6047772.html

c# winform InvokeRequired 解决跨线程访问控件相关推荐

  1. c#使用MethodInvoker解决跨线程访问控件

    c#使用MethodInvoker解决跨线程访问控件 .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIlle ...

  2. winform使用多线程时跨线程访问控件

    之前写winform用多线程,在子线程里访问窗体控件需要用委托,由于委托使用不熟练,在网上找的各种方法都觉得太复杂看不懂,后来发现一种写法如下: if (pictureBox1.InvokeRequi ...

  3. C#中跨线程访问控件问题解决方案

    net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...

  4. VS2005中,C#中跨线程访问控件问题解决方案

    最近我在做一个项目,遇到了跨线程要去访问页面控件.但是总是提示出错,不能在其它线程中修改创建控件的线程的控件的值,后来采用了匿名代理,结果很轻松地解决了.解决过程如下: 首先在窗体上,创建一个list ...

  5. WinForm中新开一个线程操作窗体上的控件(跨线程操作控件)GOOD

    http://www.cnblogs.com/joey0210/p/3450379.html 最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录 ...

  6. 跨线程操作无效:从创建该线程的线程以外的线程访问控件

    我有一个场景. (Windows窗体,C#.. NET) 有一个主窗体可以承载一些用户控件. 用户控件执行一些繁重的数据操作,因此,如果我直接调用UserControl_Load方法,则UI在加载方法 ...

  7. 多线程总结之旅(12):跨线程调用控件的几种方式

    本来是写完线程池就结束多线程总结之旅系列的,但是想想平时在项目中用到线程仅仅不够的,为什么这么说呢?举个例子:我们有一个函数,它的功能就是加载数据,然后绑定到datagridview.现在我们开启一个 ...

  8. c#跨线程操作控件(有UI操作)|及多线程操作

    仅记录(好多大佬都会): 跨线程操作UI控件 ※在.NET2.0之后为了线程之间的安全,不允许跨线程操作控件,最简单的解决办法是禁止检查,但一般不猜用此方法,会造成各线程之间的混乱,可用作临时调试使用 ...

  9. C# 跨线程调用控件

    在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...

最新文章

  1. 快速沃尔什变换(FWT)及K进制异或卷积快速子集变换(FST)讲解
  2. spring boot apollo demo
  3. 字符串-文本对齐方法演练
  4. leetcode 581. 最短无序连续子数组(详解普通 / 进阶 / 单调栈解法,Java版)
  5. 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
  6. 学习笔记(45):Python实战编程-键盘事件
  7. java)_Java NIO系列教程(一) Java NIO 概述
  8. linux如何安装交叉工具链,Linux:制作mipsel 交叉工具链 (更新版)
  9. opencv批量灰度转换_OpenCV图像处理之常见的图像灰度变换
  10. Linux操作系统基本命令
  11. .Net WebApi接口之Swagger集成详解
  12. CSS设置颜色的几种方式
  13. 欧姆龙PLC的FINS协议解释(实测通过)
  14. C语言编程练习题_02兰州烧饼
  15. 网上说的白帽子黑帽子都是什么?
  16. 解决Git克隆代码 the remote end hung up unexpectedly 错误
  17. 一篇好文之Android数据库 SQLite全解析
  18. Google账户登录服务
  19. 高可用集群下的负载均衡(7):haproxy + keepalived 实现高可用负载均衡
  20. 小 200 行 Python 代码做了一个换脸程序

热门文章

  1. C#WIFI搜索与连接
  2. 流水灯实例,点亮发光管LED并闪烁(查表操作)
  3. 【Ex_BSGSBSGS算法模板】poj2417 poj3243
  4. SDUT_2075 最少拦截系统
  5. [YTU]_2570 指针练习——变量交换
  6. [YTU]_2617( B C++时间类的运算符重载)
  7. matlab中textread 函数
  8. 求积问题[体会Python至简之道]
  9. 卷积、相关(matlab)
  10. Java之二分法查找