1.首先通过按键创建子线程:

创建子线程,子线程调用changeText方法。

      private void btnOK_Click(object sender, EventArgs e)
{
Thread th = new Thread(changeText);
th.Name = "new Thread!";
th.IsBackground = true;
th.Start();
}

2.子线程操作弹窗提示:

      void changeText()
{
Thread.Sleep();
MessageBox.Show("进入子线程:"+Thread.CurrentThread.Name);
}

效果图:

3.子线程修改主线程控件

(1)错误的直接使用:

     void changeText()
{
Thread.Sleep();
textBox1.Text = "进入子线程!";
}

效果图:

(2)关闭跨线程的检查:

       CheckForIllegalCrossThreadCalls = false;

效果图:

(3)对跨线程进行检查

声明委托:

注:参数类型是object型

     public delegate void changeTextHandler(object str);

按键点击调用方法修改控件:

注:参数不是在线程创建的时候写入,是在start函数写入!

     private void btnOK_Click(object sender, EventArgs e)
{
Thread th = new Thread(changeText);
th.Name = "new Thread!";
th.IsBackground = true;
th.Start("进入子线程!");
}

修改控件的方法(带一个参数):

     void changeText(object str)
{
if (textBox1.InvokeRequired == true)
{
changeTextHandler ct = new changeTextHandler(changeText);
textBox1.Invoke(ct, new object[] { str });
}
else
{
textBox1.Text = str.ToString();
}
}

效果图:

(4)使用MethodInvoker解决跨线程问题

  •   MethodInvoker是无参无返回值;
  •   Action是多参无返回;
  •   Func是多参又返回。
      private void btnOK_Click(object sender, EventArgs e)
{
Thread th = new Thread(changeText);
th.Name = "new Thread!";
th.IsBackground = true;
th.Start();
}

调用对事件的处理方法:

     void changeText()
{
Thread.Sleep();
MethodInvoker ln = new MethodInvoker(change);
this.BeginInvoke(ln);
}

调用对控件的修改方法:

         void change()
{
textBox1.Text = "进入子线程!";
}

效果图:

C#跨线程操作控件的更多相关文章

  1. WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)

    最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...

  2. C# 跨线程操作控件(简洁)

                                              C# 跨线程操作控件 .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生.解决此问题的方法有两个: 第一 ...

  3. C#跨线程操作控件的最简单实现探究

    随着程序复杂度的提高,程序不可避免会出现多个线程,此时就很可能存在跨线程操作控件的问题. 跨线程操作UI控件主要有三类方式: 1.禁止系统的线程间操作检查.(此法不建议使用) 2.使用Invoke(同 ...

  4. winform 跨线程操作控件

    当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程 ...

  5. 在.Net中进行跨线程的控件操作(下篇:BackgroundWorker)

    在.Net中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么如何处理这种情况呢?在上一章中,我介绍了使用Control.Invoke方法,如果你不习惯使用委托,那么.N ...

  6. C# 跨线程调用控件

    在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线程间操作无效 第一种办法:禁 ...

  7. winform跨线程访问控件

    首先说下,.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性.所以除了控件所在的线程外的线程调用会抛异常 (Cross-thread operation not va ...

  8. C# 关于跨线程访问控件问题

    跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有.在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理.因此,当没有使用委托 ...

  9. 【转载】C# 跨线程调用控件

    转自:http://www.cnblogs.com/TankXiao/p/3348292.html 感谢原作者,转载以备后用 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停 ...

随机推荐

  1. 修改wampserver 默认localhost 和phpmyadmin 打开链接

    在wamp上 左键打开localhost 自定义端口的话 或者其他网址 需要以下修改(同样访问phpmyadmin修改也是这个地方) 修改文件路径 D:\wamp\wampmanager.tpl 搜索 ...

  2. Orchard源码分析(4):Orchard.Environment.OrchardStarter类

    概述 OrchardStarter类是个静态类,主要作用是配置Autofac容器以及创建IOrchardHost(DefaultOrchardHost)对象,分别对应CreateHost和Create ...

  3. Python开发【第十九篇】:Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  4. 用svnsync 同步备份 svn 版本库 从一台服务器到另一台服务器

    如用svnsync 同步备份两台机器的svn .(就以linux服务器到windows服务器为例子) 要同步的项目名称:source_svn svn 版本库1 .4 以上 源目录:           ...

  5. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

  6. .Net Core 之 图形验证码

    本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能. 通过测试的系统: Windows 8.1 64bit Ubuntu Server 16.04 LTS 64 ...

  7. 在OS X中使用Homebrew

    Homebrew可以很方便的进行软件包管理,用官网的一句话来形容就是 Homebrew 使 OS X 更完整.用 gem 来安装您的 gems.用 brew 来搞定它们的依赖包. 安装Homebrew ...

  8. ajax基础了解

    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据.这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息.AJAX即“Asynchronous JavaSc ...

  9. hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))

    Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  10. Centos ftp服务器安装配置

    yum install vsftpd [root@localhost ftp]# /sbin/service vsftpd restart 查看FTP目录 # more /etc/passwd|gre ...