以下引用自:   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);}

可惜并不是我想的那样, 运行情况是先弹出 ChildThread, 然后弹出 MainThread, 最后才弹出 MainThread全速运算刚刚结束了

有谁可以解释一下么???????????? 难道同一个线程也有CPU时间片的概念? 以前听说过线程插入进程, 但没听说过 线程也可以被插入啊?



C# 中MethodInvoker的理解相关推荐

  1. javascript中 (function(){})();如何理解?

    javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...

  2. java抽象的理解_Java中抽象类的理解

    Java中抽象类的理解 创建   所有   bsp   抽象类   member   初始   dem   print ---------------------------------------- ...

  3. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  4. 【转载】谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 转载自: http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallB ...

  5. C++中关键字的理解--Static

    C++中关键字的理解---Static    目录:1.static缘起             2.static自我理解             3.static举例使用             4 ...

  6. 交互搜索中的自然语言理解技术

    交互搜索 交互搜索是一种新的产品形态,可以和用户对话,记住用户的购物需求和偏好,提供购物知识和建议.在搜索页面下拉就可以进入了,类似于微信的小程序的进入方式. 自然语言理解 对话和搜索的最大区别就是对 ...

  7. php钩子是啥意思,php中的钩子理解及应用实例分析

    本文实例讲述了php中的钩子理解及应用.分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要.它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以 ...

  8. java 打开jsp文件_jsp文件怎么打开(java-web中jsp的理解)

    jsp文件怎么打开(java-web中jsp的理解)JSP:Java Server Pages.JSP是一种网页的编码格式,不同于HTML的是JSP中是由 HTML中的标签指令 和 Java逻辑代码 ...

  9. php钩子的作用,php中的钩子理解及应用实例分析

    本文实例讲述了php中的钩子理解及应用.分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要.它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以 ...

最新文章

  1. css3替代图片的尖角圆角效果
  2. 小程序接收json_微信推出QQ小程序,但只能接收消息无法回复!网友:鸡肋
  3. ML+DM顶会时间(2020)
  4. python—多线程之死锁
  5. vector动态数组
  6. imagex使用方法_Microsoft OneDrive 的使用心得,真香
  7. UEditor 1.36 版本 jsp版上传图片自定义路劲配置
  8. D. Magic Breeding
  9. python中的pylab_Python数值计算:一 使用Pylab绘图(1)
  10. Linux命令(压缩,解压rar)
  11. java 怎么入门_学习java怎么入门
  12. API接口之webservice接口
  13. c++避坑指南-除数为0
  14. 【研究生论文写作】 思政相关题目选择题
  15. Linux C 函数参考(日期时间) 作者: 出处:hur.cn 更新时间: 2007年01月29日
  16. Unifying Task-oriented Knowledge Graph Learning and Recommendation
  17. 数据结构---线性表
  18. 好看可乐的韩剧综艺-推荐两部
  19. 零 XML 多表联查
  20. 释放sqlite文件占用的多余空间

热门文章

  1. 微信网页内使用canvas生成个性化海报
  2. H5 微信开发接入流程(网页登陆授权JS-SDK授权)
  3. html5 css3 marquee,css3 marquee
  4. C# Console.WriteLine()不在输出窗口显示内容
  5. “中国IT就业训练营”正式启动 首次校园公开课成功举办
  6. 流量监控分析工具-ZEEK
  7. JavaWeb项目excel文件导入
  8. git 撤销上一个 commit
  9. windows弹窗显示应用程序0xc0000005错误解决方法
  10. Ukulele 常用和弦