文章目录

  • 一、直接调用方法,方法中使用委托【textBox1.InvokeRequired】
  • 二、调用委托,委托进一步关联方法
    • 1.使用委托【最基础的调用方法:委托五步法】
    • 2.使用Action作为委托来创建
      • 1)第一步简化:用Action作为委托来创建
      • 2)第二步简化:委托对象只用一次,所以可以直接放到参数里
      • 3)第三步简化:用Lamda表达式代替方法【推荐使用!!!】

一、直接调用方法,方法中使用委托【textBox1.InvokeRequired】

using System;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}public Thread th = null;private void button1_Click(object sender, EventArgs e){th = new Thread(Start);th.IsBackground = true;th.Start();}private void Start(){AddStr("111");UpdateText4("222");if (th != null){th.Abort();}}//方法一:TextBox1的委托delegate void AddDg(string str);        //声明一个委托private void AddStr(string str){if (textBox1.InvokeRequired){AddDg dg = new AddDg(AddStr);textBox1.Invoke(dg, str);}else{textBox1.Text += str;}}//方法二:TextBox2的委托private void UpdateText4(object str){if (textBox2.InvokeRequired){// 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它Action<string> actionDelegate = (x) => { this.textBox2.Text += x.ToString(); };     //Lambda表达式的应用                                                                                                      //Action<string> actionDelegate = delegate (string txt) { this.textBox3.Text += txt; }; // 或者this.textBox2.Invoke(actionDelegate, str);}else{this.textBox2.Text += str.ToString();}}}
}

二、调用委托,委托进一步关联方法

1.使用委托【最基础的调用方法:委托五步法】

委托五步法:创建委托、声明委托、创建委托方法、委托绑定、调用委托

using System;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApp1
{public partial class Form1 : Form{//【01】声明委托public delegate void SetFormTextDelegate();//【02】创建委托对象private SetFormTextDelegate SetFormText;//【03】委托关联的方法private void ExcuteMethod(){textBox1.Text = "跨线程调用控件成功";}public Form1(){InitializeComponent();//【04】委托绑定this.SetFormText = ExcuteMethod;}public Thread th = null;private void button1_Click(object sender, EventArgs e){th = new Thread(Start);th.IsBackground = true;th.Start();}private void Start(){//错误调用委托【报错:System.InvalidOperationException:“线程间操作无效: 从不是创建控件“Form1”的线程访问它。”】//因为想要在多线程里操作主线程的控件,你还得经过控件的同意【使用.Invoke()方法】//SetFormText();//【05】正确调用委托this.Invoke(SetFormText);}}
}


控件的父类Control提供了下边的方法:

2.使用Action作为委托来创建

微软从某个版本开始,出来了Action和Lamda表达式,Action是系统委托,也就是说,不需要我们手动创建委托了,它有个兄弟叫Func。

Action没有返回值,最多可以有16个参数。
Func必须要有返回值,最多可以有16个参数,最后一个参数表示返回值。

1)第一步简化:用Action作为委托来创建

     /// <summary>/// 多线程方法/// </summary>private void Start(){//【01】创建委托、绑定委托Action action = new Action(ExcuteMethod);//【02】调用委托this.Invoke(action);}//委托关联的方法private void ExcuteMethod(){textBox1.Text = "跨线程调用控件成功";}

2)第二步简化:委托对象只用一次,所以可以直接放到参数里

     /// <summary>/// 多线程方法/// </summary>private void Start(){//【01】创建委托、绑定委托、调用委托this.Invoke(new Action(ExcuteMethod));}//委托关联的方法private void ExcuteMethod(){textBox1.Text = "跨线程调用控件成功";}

3)第三步简化:用Lamda表达式代替方法【推荐使用!!!】

         /// <summary>/// 多线程方法/// </summary>private void Start(){//【01】创建委托、绑定委托、调用委托this.Invoke(new Action(()=>{textBox1.Text = "跨线程调用控件成功";}));}

C#【委托/事件篇】跨线程访问窗体控件的方法相关推荐

  1. java 线程访问控件_C#多线程与跨线程访问界面控件的方法

    本文实例讲述了C#多线程与跨线程访问界面控件的方法.分享给大家供大家参考.具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象.启用新线程去访问Web ...

  2. C#跨线程调用窗体控件的问题

    前段时间遇到跨线程调用窗体控件的问题,其实一句话System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;就可以解决,但 ...

  3. C# WinForm跨线程访问UI控件

    C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...

  4. c#如何跨线程调用窗体控件

    public partial class Form1 : Form     {         public Form1()         {             InitializeCompo ...

  5. 线程访问 DevExpress控件异常时 解决方法

    线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...

  6. c# 跨线程访问窗体UI

    定义个结构体用于存储线程中传递的参数信息 struct ImgInfo {public string url;public string path; }; 参数传递到线程中 ImgInfo img1; ...

  7. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  8. 如何跨越线程调用窗体控件?(1)

    一.前言 VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序.在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速. ...

  9. InvokeHelper,让跨线程访问/修改主界面控件不再麻烦(转)

    http://bbs.csdn.net/topics/390162519 事实上,本文内容很简单且浅显,所以取消前戏,直接开始.. 源代码:在本文最后 这里是一张动画,演示在多线程(无限循环+Thre ...

最新文章

  1. 文献学习(part87)--Linearized Alternating Direction Method with Adaptive Penalty for Low-Rank ...
  2. 自增主键与UUID的优缺点
  3. Codeforces Round #698 (Div. 2) A-E解题报告与解法证明
  4. 外显子和基因组基本概念(一)
  5. 风控算法知识——WOE值的深度理解与应用
  6. 华为路由交换常见配置
  7. 多线程junit单元测试
  8. python GIL 全局锁
  9. linux下的man和info命令
  10. 常用UCI数据集链接,mark
  11. java邮件抄送_JAVA实现邮件抄送,密送,多个附件发送
  12. 转型只争朝夕!又一火电企业成立新能源公司
  13. 下载好的IDEA双击打不开,解决方法
  14. 电信宽带华为HG8245光纤猫开路由、WIFI的破解办法
  15. html语言中%3cp%3e%3cbr%3e,求一段弹出窗口代码
  16. 方舟服务器显示等待发布,《明日方舟》开服既炸服的这波操作《方舟生存进化》永远也学不会...
  17. 残疾男子发起倡议:公务员招一定比例残疾人
  18. 如何把thrift rpc转换为http
  19. tensorflow的early stopping模型保存方式
  20. Redis Windows版本的安装以及使用(简单版)

热门文章

  1. 说说如何实现可扩展性的大型网站架构
  2. 使用FudanNLP分词工具分词并移除停用词
  3. 每日新闻 | 苹果信用卡Apple Card今日推出!部分用户已收到邀请
  4. WIN7系统“无线网络显示用于网络的保存在该计算机上的设置与网络的要求不匹配”解决办法
  5. 【计算机图形学】RGB图像在计算机中存储方式的理解——图形学基础
  6. Java设置环境变量的作用和意义
  7. 自强创新之路 打造真正上网不花钱8500WN已面世
  8. 解决在微信 H5 页面 background 背景图显示不出来
  9. 小程序开发必备的高级能力之四:mDNS
  10. 【OpenCV--直方图】