`
junherry
  • 浏览: 95820 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • .net
阅读更多

在利用Visual Studio2005编写窗体控件的应用程序时,往往会遇到这样的问题:有两个控件,分别为A和B,我们要通过控件A做一个复杂操作,在这个操作过程要设置B的相关属性。如果我们把该操作放在线程中,就可能出现线程安全问题。下面根据一个例子来说明一下。

我们假设一个情景,窗体中有一个TabControl控件tc_thread,控件里边共有两个tab页分别为tab1和tab2,控件的下边有一个label控件myLabel。我们希望当来回切换tab1和tab2时,myLabel的text能做出响应,整个过程要放在一个线程中。代码如下

这时候如果运行程序,会出现异常:线程间操作无效: 从不是创建控件tc_thread的线程访问它。因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的状态不一致,出现争用或死锁状态。这种情况有以下解决办法:

1. 可以在load时将CheckForIllegalCrossThreadCalls 属性的值设置为 false 。这样进行非安全线程访问时,运行环境就不去检验它是否是线程安全的。

2. 利用委托机制实现线程安全。上面的代码可以更改如下:

建立一个委托:delegate void SetLabelCallBack();

分享到:
评论

相关推荐

    “线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法

    文档中讲解了C#中在使用多线程,跨线程操作时报错“线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法。

    从不是创建控件“textBox1”的线程访问它.zip

    解决办法:线程间操作无效: 从不是创建控件“textBox1”的线程访问它(未处理System.InvalidOperationException)(委托)

    Winform跨线程操作的简单方法

    线程间操作无效:从不是创建控件“label1”的线程访问它

    C#中,使用Thread新创建一个线程来查询数据库中的信息显示在控件“listView1”上,需要使用Invoke(代理名)方法来访问控件“listView1”,

    C#中,使用Thread新创建一个线程来查询数据库中的信息显示在控件“listView1”上,需要使用Invoke(代理名)方法来访问控件“listView1”,实例讲解 ... //线程间操作无效: 从不是创建控件“listView1”的线程访问它。 }

    C#WinForm跨线程安全调用控件例程

    线程间操作无效: 从不是创建控件的线程访问它。当我们执行C#程序出现此错误提示时,可以采用委托的方法来解决,但是有个重要问题需要注意...本例程提供了跨线程安全调用控件的方法。

    从线程操作主窗体控件

    如果从线程中直接读写主窗体控件,往往会提示:线程间操作无效 从不是创建控件“___”的线程访问它的错误,这个示例说明如何通过回调方法安全操作主窗体控件

    图像实时切换

    因项目需要,遇到的问题现象:线程间操作无效,从不是创建控件的线程访问它. 主要是解决多线程与界面之间的通信 通过中间类代理Invoke

    多线程操作窗口源码2012813

    为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。使用这些技 巧,就可以实现我们在其他线程中直接修改界面的需要 InvokeHelper类中实现了多线程 操作窗口控件, 学习多...

    多线程操作窗口源码

    为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。使用这些技 巧,就可以实现我们在其他线程中直接修改界面的需要 InvokeHelper类中实现了多线程 操作窗口控件, 学习多...

    Winform中如何跨线程访问UI元素

    但直接访问会出现“线程间操作无效”的情况,因为.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误。 下面介绍几种跨线程访问的方法: 1、禁止对跨线程访问做检查 (不推荐使用这种方法) 这种...

    WindowsFormsApplication1.zip

    线程间操作无效 从不是创建控件“textBox1”的线程访问它的多种解法 环境:Visual Studio 2012 语言:C# 如有错误,请指正 如有疑问,请留言 与君共勉,共同进步! 给个赞就是对我最大的肯定!

    易语言 茶凉专用模块

    子程序 创建线程, 整数型, 公开, 创建一个线程来启动子程序(返回线程句柄) .参数 线程子程序, 子程序指针, , 欲启动的线程子程序指针 .参数 传递参数, 整数型, 可空 .子程序 打开网页, 逻辑型, 公开, 打开指定网址...

    精易官方免费模块v3.60版

    2.增加 DLL "RtlMoveMemory_整数型2",目前应用于 类_位图操作 的 “从屏幕创建” 1.删除 “网页_验证码读取” 该命令是封装的 网页_访问_对象,所以 请直接使用“网页_访问”或“网页_访问_对象”读取验证码,根据...

    精易模块[源码] V5.15

    1、新增“线程_枚举”枚举指定进程ID中所有线程列表,成功返回线程数量,失败返回零。 2、删除“文件_取图标”与"文件_取图标句柄"功能重复。 3、优化“系统_创建桌面快捷方式”流程代码,感谢易友[ds9660]反馈。 4...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    易语言程序免安装版下载

    6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和记录集句柄无效的BUG(改动较大,可能会产生兼容性问题,我们已经仔细测试,也请使用到此库的用户帮助我们多多测试,以便及早发现问题,谢谢) 7) 其它修改 ...

    MD5校验器

    本程序采用工作线程编写,只要机器配置不是特别低的话,软件 界面一般不会出现卡死不能移动、不能操作的现象。 最新加入了“程序总在最前显示”、“最小化到托盘”等功能。 ------------------------...

    飞鸽传书(IPMessenger) 源码

     如果需要删除 IPMsg, 请先从控制面板中卸载, 再手动删除 IPMsg 目录.  系统托盘区图标 >  左键双击图标, 即可打开发送消息窗口.  右键点击图标, 可进入 [服务设置], [离开] 等.  发送消息窗口 >  - 发送消息...

    window32 API大全 win32编程

    如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。 Windows CE:Windows CE不支持...

Global site tag (gtag.js) - Google Analytics