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

第一个例子

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

错误显示:

未处理的“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. datatables的Bootstrap样式的分页怎么添加首页和尾页(引)

    找到dataTables.bootstrap.js(版本3):(此项目中文件名为:dataTableExt.js) $.fn.dataTableExt.oApi.fnPagingInfo = func ...

  2. SmartDo数据挖掘思路

    SmartDo数据挖掘思路 数据挖掘部分: 数据挖掘的主要网址为: https://www.amazon.com/Best-Sellers/zgbs 挖掘部分为网址左边的入口,大约20多个,其中页面分 ...

  3. TP框架基础

    什么是TP框架: 一堆代码的集合,里边有变量.函数.类.常量,设计模式MVC.AR数据库.单例等等.全称是Tinkphp框架; 为什么使用框架: 使用框架将全部精力集中在业务层次,节省50-60%的工 ...

  4. openstack(liberty):部署实验平台(二,简单版本软件安装 part2)

    继续前面的part1,将后续的compute以及network部分的安装过程记录完毕! 首先说说compute部分nova的安装. n1.准备工作.创建数据库,配置权限!(密码依旧是openstack ...

  5. HTML 段落

    可以把 HTML 文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>This is a paragraph</p> <p&g ...

  6. Visual Studio Professional 2015 (x86 and x64) - DVD (Chinese-Simplified)

    文件名cn_visual_studio_professional_2015_x86_x64_dvd_6846645.isoSHA1629E7154E2695F08A3C692C0B3F6CE19DF6 ...

  7. IntelliJ IDEA设置JDK

    File→Project Structure→Project SDK→New   来自为知笔记(Wiz)

  8. Ansible常用模块及API

    Ansible安装 安装EPEL作为安装Ansible的yum源(CentOS6.4): rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel ...

  9. ssh登录慢,等待输入密码时间长

    有时候在ssh远程登录到其他主机上时发现登录时间太长,要等待很久才会出现输入密码的提示,google了一下,发现主要有两个问题会导致ssh登录慢: 1.使用了dns反查,这样的话当ssh某个IP时,系 ...

  10. C基础--结构体成员初始化方式

    之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...