经典解决“线程间操作无效: 从不是创建控件的线程访问它”
在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。
        为什么.net不让我们跨线程操作控件,这是有好处的。因为如果你的线程多了,那么当两个线程同时尝试将一个控件变为自己需要的状态时,线程的死锁就会发生。但是难道就是因为这个原因,我们就只能让程序卡着么?当然不是,这里教大家两个个解决方案:

(1)不使用委托:在构造函数或者窗体Load的代码里添加下面一句:
Control.CheckForIllegalCrossThreadCalls = False
(2)委托方法的实现

delegate void SetTextCallback(string text);
event SetTextCallback SetTextEvent;    
//调用窗体中的函数用invoke传递参数
private void SetText(string text)
{
    if (this.txtShow.InvokeRequired)
{                
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
}
else
{                      
    this.txtShow.Text += text+"\n";
}
}

SetTextEvent += new SetTextCallback(SetText);

SetText(str);

(3)

this.Invoke(new MethodInvoker(DisplayReceiveMessage));
private void DisplayReceiveMessage()
{txt_visble.Text = "hello world" }

以上出自:好记性不如烂博客

==================================================================================
以下详解出自:
http://hi.baidu.com/jcserver/blog/item/b7e8da3e2f6f35f0828b13f1.html

在设计中为了让界面与逻辑分离,我的做法是使用事件,界面只要响应事件来处理界面的显示就行了。而事件在逻辑处理中可能由不同的线程引发,这些事件的响应方法在修改界面中的控件内容时便会引发一个异常。

这时就用到了Control.InvokeRequired 属性 与Invoke方法。

MSDN中说:
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 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是一个文本框。
这样就做到了窗体中控件的线程安全性。
转自:http://www.juanlian15.cn/article.asp?id=64

转载于:https://www.cnblogs.com/gebenhagen/archive/2011/05/16/2048103.html

【转】“线程间操作无效: 从不是创建控件的线程访问它”相关推荐

  1. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  2. 线程间操作无效: 从不是创建控件的线程访问它

    转自原文 线程间操作无效: 从不是创建控件的线程访问它. using System; using System.Collections.Generic; using System.ComponentM ...

  3. 线程间操作无效: 从不是创建控件的线程访问它。

    private void button1_Click(object sender, EventArgs e){//报错:从不是创建控件的线程访问它Thread t = new Thread(() =& ...

  4. c#报错 :System . Invalid Operation Exception:“线程间操作无效: 从不是创建控件的线程访问它

    一.问题来源 跨线程操作时会报错:System.InvalidOperationException:"线程间操作无效: 从不是创建控件的线程访问它. 二.问题代码 using System; ...

  5. 线程间操作无效,从不是创建控件的线程访问它。

    最近在开发项目时用到了操作线程的问题,在新线程中写入了操作控件的代码如: this.btnToolUpload.Enabled = true; 但是在线程执行过程中,当执行到这段代码时提示:" ...

  6. C# WinForm 线程间操作无效: 从不是创建控件的线程访问它的解决办法

    .net2后是不能跨线程访问控件的.,窗体上的控件是当前线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会 ...

  7. c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决

    如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的 ...

  8. C#线程间操作无效: 从不是创建控件 XX 的线程访问它

    转自:http://www.arasplm.net/index.php/zh/community/myblog/c-xx-.html 前些天做的要使用到线程的项目,现在和大家分享一下感受! 以下面小列 ...

  9. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”...

    "System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: ...

最新文章

  1. Gradle dependency cache may be corrupt
  2. 动态网页制作PHP常用的正则表达式
  3. Entity Framework
  4. 26个导航设计非常独特的网站案例欣赏
  5. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲
  6. 学习笔记----周志华《机器学习》第五章(神经网络)(一)
  7. java 创建日程到期提醒_日程管理工具—Things 3
  8. Jenkins发布spring boot到hub.Docker 方法
  9. 二分查找 —— 从三分支到二分支
  10. UnityShader22:序列帧动画
  11. UnityShader19:渲染纹理(上)之截屏功能实现
  12. python中seek(10、1)_Python中index()和seek()的用法(详解)
  13. 拓端tecdat|R语言数据可视化分析案例:探索BRFSS数据
  14. 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
  15. 什么是php探针,以及雅黑探针使用教程
  16. .net core mvc中使用ef
  17. html 旋转木马 轮播,JS实现旋转木马轮播图
  18. epoll底层原理深究
  19. android开发 高德地图自定义地图应用【最新】
  20. 按字母顺序排列c语言,C语言有n个国家名,要求按字母先后顺序排列,并按升序输出。(要求:尽量使用标准字符串函数)...

热门文章

  1. [Leetcode 376]摇摆序列 Wiggle Subsequence
  2. HTML5 input 类型
  3. [PAT乙级]数字分类 (20)
  4. js ejs for语句的第二种遍历用法
  5. 面向对象概述(课堂笔记)
  6. Vertex and Fragment Shader
  7. sql数据库连接不上本地数据库的解决办法
  8. as3 physaxe 2d 物理引擎
  9. 周至四中计算机老师,周至县第四中学顺利承办周至县 “教育信息化技术与教学课堂深度融合交流研讨会”...
  10. linux 刻录cd,Linux 刻录CD/DVD命令 growisofs/mkisofs/cdrecord