C# 中禁止跨线程访问解决-- MethodInvoker的理解
以下引用自: c#使用MethodInvoker解决跨线程访问控件
net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIllegalCrossThreadCalls = false;可以实现访问,但是出不出错不敢保证C#跨线程访问控件运行时错误。
使用MethodInvoker即可解决
看看系统定义, 与event 的区别
public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);
简单来说 :
MethodInvoker 是不带参数的委托。
EventHandler 是可带参数的委托
我是这样理解的, 开启新线程 threadRun, 在新线程中使用MethodInvoker 委托执行 run()方法, 这个时候 run() 方法其实是在主线程中执行的, 这样就避免了 跨线程访问控件, 以下是我的测试代码:
private void button1_Click(object sender, EventArgs e){Thread.CurrentThread.Name = "MainThread"; //主线程命名为 MainThreadThread td = new Thread(threadRun);td.Name = "ChildThread"; //子线程命名为 ChildThreadtd.Start();}private void ChangeText(){this.textBox1.Text = Thread.CurrentThread.Name; //TextBox1内容被修改的线程的名字}private void threadRun(){MessageBox.Show(Thread.CurrentThread.Name); //弹出对话框, 当前运行线程的名字MethodInvoker In = new MethodInvoker(ChangeText);this.BeginInvoke(In);
运行后, 点击 Button 首先弹出对话框 ChildThread, 然后 TextBox1 改为 MainThread
然后我的牛角劲又来了, ChangeText 被 MethodInvoker 插入到主线程中运行, 那么 ChangeText 应该是在 button1_Click 完全结束后才运行吧, 测试代码
private void button1_Click(object sender, EventArgs e){Thread.CurrentThread.Name = "MainThread"; //主线程命名为 MainThreadThread td = new Thread(threadRun);td.Name = "ChildThread"; //子线程命名为 ChildThreadtd.Start();int k=0; //让主线程全速运行一段时间for (long i = 0; i < 1000000000; i++){if (k > 10000) k = 0;k = k+5;}MessageBox.Show("MainThread全速运算刚刚结束了");}private void ChangeText(){MessageBox.Show(Thread.CurrentThread.Name); //弹出执行ChangeText的线程的名字}private void threadRun(){MessageBox.Show(Thread.CurrentThread.Name); //弹出对话框, 当前运行线程的名字MethodInvoker In = new MethodInvoker(ChangeText);this.BeginInvoke(In);}
抄自博客https://blog.csdn.net/zhouandke/article/details/46821309
C# 中禁止跨线程访问解决-- MethodInvoker的理解相关推荐
- MySQL源码学习:MySQL中禁止跨库访问的实现
摘要: 先说一下这里"跨库"的意思:当前use的是db1, 仍可以使用select * from db2.table1来访问table1表. 这样使得我们需要访问同一个MySQL ...
- c#使用MethodInvoker解决跨线程访问控件
c#使用MethodInvoker解决跨线程访问控件 .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIlle ...
- c# winform InvokeRequired 解决跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. Windows 窗体中 ...
- c#中如何跨线程调用windows窗体控件?
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...
- 使用MethodInvoker委托进行跨线程访问
MethodInvoker 提供一个简单委托,该委托用于调用含 void 参数列表的方法.在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托(摘自MSDN) ...
- 在.Net中进行跨线程的控件操作(上篇:Control.Invoke)
本文的重点在于介绍如何在多线程编程中,从非UI线程上访问界面中的控件.有过多线程编程经验的人都知道,当我们在非UI线程上试图给一个界面中的控件赋值的时候,比如说label的Text属性,系统会抛出一个 ...
- VS2005中,C#中跨线程访问控件问题解决方案
最近我在做一个项目,遇到了跨线程要去访问页面控件.但是总是提示出错,不能在其它线程中修改创建控件的线程的控件的值,后来采用了匿名代理,结果很轻松地解决了.解决过程如下: 首先在窗体上,创建一个list ...
- C# 学习笔记(8) 控件的跨线程访问
C# 学习笔记(8) 控件的跨线程访问 本文参考博客 C#多线程 https://www.cnblogs.com/dotnet261010/p/6159984.html C# 线程与进程 https: ...
- InvokeHelper,让跨线程访问/修改主界面控件不再麻烦(转)
http://bbs.csdn.net/topics/390162519 事实上,本文内容很简单且浅显,所以取消前戏,直接开始.. 源代码:在本文最后 这里是一张动画,演示在多线程(无限循环+Thre ...
最新文章
- sql between包括两端吗_简单查询-SQL
- 赠书 | 《数据驱动:从方法到实践》预售正式开启
- jseclipse 是eclipse插件,让你编写js代码感觉更爽
- 一个html有几个css,几个CSS的黑科技_html/css_WEB-ITnose
- 泛型技巧系列:类型字典和Type Traits
- 闭环检测python_hdl_graph_slam源码解读(七):闭环检测
- 近期可能会研究和讨论的个人动向
- 高中计算机试题一,職业高中高考计算机专业试卷1.doc
- Linux /etc/rc.d 下面 rc${runlevel}.d rc.local init.d 区别
- Python项目实践:霍兰德人格分析雷达图
- Openstack 网络模块
- B站试用期刚过,被HR和大老板一起谈话,说我工作没任何问题,但今晚必须走人!...
- margin-left:-100%
- kernel 选项详解(stlinux2.3) 2-2
- vue的scoped 样式隔离,样式穿透,及细节
- java计算机毕业设计汽车售后服务信息管理系统的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
- 基于JAVA共享单车管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
- CFA协会委托Prometric协助完成CFA(R) I级课程的数字化转型
- 应用系统AD-及AD认证
- 戈泽尔matlab_泽尔将军说硅谷是精英人士,他们能否建立一个新系统
热门文章
- Qtranslate翻译出现“未返回数据”怎么解决
- 手机行业通用名词解释大全(不看不知道)
- 《三国演义》与“项目管理”——向刘备拜师
- Java中两个List之间的比较(差集,交集,并集)
- [C#学习] BindingNavigator控件
- 【ansible2】ansible常用模块
- 【万字总结】以插排和分治为例来看如何分析与设计算法
- 乖离性暗机器人_乖离性百万亚瑟王超弩级暗机器人打法攻略
- Android 仿微信“正在输入...”效果快速实现
- 高德地图找房 # 编程大实践 # Python # 嵩天 # cilay