看两个例子,一个是在一个进程里设置另外一个进程中控件的属性。另外一个是在一个进程里获取另外一个进程中控件的属性。

第一个例子

最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题,

错误显示:

未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。

其他信息: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

以前很少做关于线程的程序,而且对于线程的理解也不是很深,无奈只好百度之。很快从网上找到了解决方案:

方法1、在Form Load事件中加入

 
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
这是是最简单的方式!

方法二、使用Invoke调用委托

参考示例代码:

1.定义 委托
   delegate void myDelegate(int i);
   myDelegate mydelegate = null;

2.定义方法,显示消息

public void ShowMessage(int i)
        {
            this.textBox1.Text = i.ToString();
            this.progressBar1.Value = i;
        }

3.定义方法,驱动消息

public void MyEvent()
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(100);
                this.BeginInvoke(mydelegate, new object[] {i});
            
            }
        }

4: 运行
  private void button1_Click(object sender, EventArgs e)
        {
            mydelegate = new myDelegate(ShowMessage);
            Thread myThread = new Thread(MyEvent);

//IsBackground 是否后台
            //这个属性很重要 .如果 Thread IsBackground 等于false
            // 当线程还没有结束时,你点了关闭按钮
            // 将抛出An unhandled exception
            //of type 'System.InvalidOperationException'
            //occurred in System.Windows.Forms.dll 异常
            myThread.IsBackground = true;
            myThread.Start();
        }

问题分析:

根据错误提示,可知在调试器中运行应用程序时,如果不是控件的创建者线程试图调用该控件时,则调试器会引发 InvalidOperationException,并提示消息:“从不是创建控件 Control Name 的线程访问它。” 说白了,就是资源访问的不一致性,控件的调用者线程不是控件的创建者线程,这是.net实现资源安全访问机制的必然结果。访问 Windows 窗体控件本质上不是线程安全的。如果多个线程同时操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。

第二个例子

线程间操作无效: 从不是创建控件“”的线程访问它。
听说2003里边不会,我不知道是不是这样的,反正一直都在用05~
05里会出这个问题的,貌似是为了安全~
哦,现在知道的解决方法有两个~

第一:

Control.CheckForIllegalCrossThreadCalls = false;

线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~

第二:
用委托,在05里,每个控件都有个InvokeRequired的属性~
判断一下是不是true,是的话进行Invoke操作的,完事了~

//建立个委托
private delegate string returnStrDelegate();

//搞个最简单滴取值滴方法~
private string returnSchool()
        {
            return CB_School.SelectedValue.ToString();
        }

//判断一下是不是该用Invoke滴~,不是就直接返回~
private string returnCB(returnStrDelegate myDelegate)
        {
            if (this.InvokeRequired)
            {
                return (string)this.Invoke(myDelegate);
            }
            else
            {
                return myDelegate();
            }
        }

//别的线程里的调用哇~
string _school = returnCB(returnSchool);

大概就是这样的,貌似有听说最好别用第一种方法,具体为啥我也不知道~
反正我一直都用委托的,也不是很麻烦~

麻烦知道的更清楚的人给说一声为什么,谢谢了~

线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析的更多相关文章

  1. C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法

    最近在做项目的时候需要操作ftp进行文件的上传下载,但在调用using (var response = (FtpWebResponse)FtpWebRequest.GetResponse())的时候总 ...

  2. Jmeter遇到线程链接被重置(Connection reset by peer: socket write error)的解决方法

    做性能测试的时候遇到一个很奇怪的问题,多线程的计划,有一个线程第一次能跑过,第二次确跑不过,单独跑这个线程跑多少次都没有问题,把思考时间改短也没有问题,唯独出现在特定的状态下,特定状态是啥,也不得而知 ...

  3. Microsoft ReportViewer 控件类型版本兼容问题及解决方法

    错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...

  4. ionic创建工程中遇到异常、错误及解决方法

    1. 创建工程——download failed ionic start myApp tabs 遇到如下错误 Downloading--Failed! Error:Timeout of 25000ms ...

  5. 【转】"超时时间已到。在操作完成之前超时时间已过或服务器未响应"的解决方法

    方法有以下三种: 1.原因应该在数据访问有问题,可以把连接时间设置长些,在数据库连接字符串,加上Connect Timeout=18000,单位毫秒 2,在web.config中加上以下语句: < ...

  6. ASP.NET Menu控件点击区域太小解决方法

    ASP.NET自带的Menu控件点击区域比较小,基本就是文本范围和图片范围,在区域外虽然选择的项有颜色变化,但是这个时候点击是没有用的,体验不是很好 检查前台生成的HTML,是用td嵌套a标签,a标签 ...

  7. mysql for Mac 下创建数据表中文显示为?的解决方法

    在我的绝版Mac mini下安装了mysql 5.7版本,实例中,在通过load data 导入数据时发现表中的中文显示为  ? 通过百度,发现多个版本的解决方法,将其中一个成功解决的方法贴上来: 大 ...

  8. cocos2d-x 多点触控实现缩放及相关问题的解决方法

    首先,来看下代码: 声明文件: #ifndef __loading__MoreTouches__ #define __loading__MoreTouches__ #include <iostr ...

  9. 日历控件My97DatePicker WdatePicker屏蔽 onchange的解决方法

    http://www.cnblogs.com/wan-feng/archive/2013/12/13/3473439.html 受下面文章的启发,使用DatePicker自带的年月日相关的change ...

随机推荐

  1. OpenJudge计算概论-矩阵归零消减序列和

    矩阵归零消减序列和 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个n*n的矩阵( <= n <= ,元素的值都是非负整数).通过n-1次实施下述过程,可把这个矩阵转 ...

  2. CSS之background属性

    css背景是个很有意思的东西,可设置 背景色:background-color 背景图:backgoround-image 背景图显示相对位置:background-position,正数图片往右下移 ...

  3. ORA-12519, TNS:no appropriate service handler found

    解决问题: 有时候连不上数据库是因为连接数到了极限了. select count(*) from v$process --当前的连接数 130 select value from v$paramete ...

  4. 【shiro】org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token

    org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.sh ...

  5. requestscope.contextpath和<%=request.getContextPath()%>有何区别?(待解答)

    问题1:requestscope.contextpath和<%=request.getContextPath()%>有何区别? 问题2:${requestscope.contextpath ...

  6. libcurl上传文件,添加自定义头

    原文  http://www.cnblogs.com/meteoric_cry/p/4285881.html 主题 curl libcurl参数很多,一不小心就容易遇到问题.曾经就遇到过一个很蛋疼的问 ...

  7. TortoiseSVN 同步分支

    对比工具可以使用 winmerge 和 beyond compare ,winmerge免费小巧,beyond compare功能更强大.这两款工具都比TortoiseSVN自带的对比工具要好一些. ...

  8. 关于Cannot assign to 'self' outside of a method in the init family解决方法

    有时候我们重写父类的init方法时不注意将init后面的第一个字母写成了小写,在这个方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息如下:error:Can ...

  9. CE_现金预测详解(案例)

    2014-07-14 Created By BaoXinjian

  10. codeblocks AStyle修改格式和快捷键

    首先我想说 codeblocks还是很强大的,原来以为不能改,其实是不会,那么本篇博客就教大家修改AStyle格式和添加快捷键. 1.修改AStyle格式: Settings -> Editor ...