c# winform InvokeRequired 解决跨线程访问控件
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 解决跨线程访问控件相关推荐
- c#使用MethodInvoker解决跨线程访问控件
c#使用MethodInvoker解决跨线程访问控件 .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIlle ...
- winform使用多线程时跨线程访问控件
之前写winform用多线程,在子线程里访问窗体控件需要用委托,由于委托使用不熟练,在网上找的各种方法都觉得太复杂看不懂,后来发现一种写法如下: if (pictureBox1.InvokeRequi ...
- C#中跨线程访问控件问题解决方案
net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...
- VS2005中,C#中跨线程访问控件问题解决方案
最近我在做一个项目,遇到了跨线程要去访问页面控件.但是总是提示出错,不能在其它线程中修改创建控件的线程的控件的值,后来采用了匿名代理,结果很轻松地解决了.解决过程如下: 首先在窗体上,创建一个list ...
- WinForm中新开一个线程操作窗体上的控件(跨线程操作控件)GOOD
http://www.cnblogs.com/joey0210/p/3450379.html 最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录 ...
- 跨线程操作无效:从创建该线程的线程以外的线程访问控件
我有一个场景. (Windows窗体,C#.. NET) 有一个主窗体可以承载一些用户控件. 用户控件执行一些繁重的数据操作,因此,如果我直接调用UserControl_Load方法,则UI在加载方法 ...
- 多线程总结之旅(12):跨线程调用控件的几种方式
本来是写完线程池就结束多线程总结之旅系列的,但是想想平时在项目中用到线程仅仅不够的,为什么这么说呢?举个例子:我们有一个函数,它的功能就是加载数据,然后绑定到datagridview.现在我们开启一个 ...
- c#跨线程操作控件(有UI操作)|及多线程操作
仅记录(好多大佬都会): 跨线程操作UI控件 ※在.NET2.0之后为了线程之间的安全,不允许跨线程操作控件,最简单的解决办法是禁止检查,但一般不猜用此方法,会造成各线程之间的混乱,可用作临时调试使用 ...
- C# 跨线程调用控件
在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应. 同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...
最新文章
- 快速沃尔什变换(FWT)及K进制异或卷积快速子集变换(FST)讲解
- spring boot apollo demo
- 字符串-文本对齐方法演练
- leetcode 581. 最短无序连续子数组(详解普通 / 进阶 / 单调栈解法,Java版)
- 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
- 学习笔记(45):Python实战编程-键盘事件
- java)_Java NIO系列教程(一) Java NIO 概述
- linux如何安装交叉工具链,Linux:制作mipsel 交叉工具链 (更新版)
- opencv批量灰度转换_OpenCV图像处理之常见的图像灰度变换
- Linux操作系统基本命令
- .Net WebApi接口之Swagger集成详解
- CSS设置颜色的几种方式
- 欧姆龙PLC的FINS协议解释(实测通过)
- C语言编程练习题_02兰州烧饼
- 网上说的白帽子黑帽子都是什么?
- 解决Git克隆代码 the remote end hung up unexpectedly 错误
- 一篇好文之Android数据库 SQLite全解析
- Google账户登录服务
- 高可用集群下的负载均衡(7):haproxy + keepalived 实现高可用负载均衡
- 小 200 行 Python 代码做了一个换脸程序