Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >子线程与UI线程的通信(委托)

子线程与UI线程的通信(委托)

作者头像
SAP梦心
发布于 2022-05-07 12:34:00
发布于 2022-05-07 12:34:00
66100
代码可运行
举报
运行总次数:0
代码可运行

由于项目中存在这样的载入的画面:在界面上有显示载入信息的Label控件和进度条,如果采用单线程则在载入数据的时候UI界面会被锁死,造成假死的感觉。为了给一个更友好的界面,因此有必要引入多线程技术,使得软件更加“人性化”。

但随后在子线程中访问界面上的控件的时候会出现异常,不能操作主线程所控制的UI界面。看来这得用到委托技术了!

首先我们定义委托:

public delegate void loadin(string data, int progress);

定义委托用delegate关键字,随后跟着一个返回值(这里void就是没有返回值了),loadin是委托名,后面带着两个参数,分别代表显示载入的数据和载入进度条的数值!

在窗体的Load事件里面我们定义一个子线程,用于在后台载入数据并显示载入情况。

定义线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ThreadStart ts = new ThreadStart(Downin);  //括号里面的参数是一个方法名,表示线程要处理的方法

     Thread mythread = new Thread(ts);    

 mythread.Start();   //线程开始运作

以上三行是线程操作的核心内容,不熟悉线程定义和执行原理等的园友请参考《C#线程参考手册》!

然后我们在Downin方法里面实例化委托并调用之。(这里“实例化”似乎用得不妥,但其实委托和类有很多地方是相似的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void Downin()

        {           

            loadin di = new loadin(Update);   //委托后面的参数跟着一个方法名

            this.Invoke(di, "正在初始化系统", 5);    //调用委托所关联的方法,并传递两个参数

            Thread.Sleep(500);                 //线程停止工作0.5秒

            this.Invoke(di, "正在载入配置信息",35);

            Thread.Sleep(500);

            this.Invoke(di, "正在载入用户数据",70);

            Thread.Sleep(500);

            this.Invoke(di, "正在完成",100);

            Thread.Sleep(500);      

            Thread.CurrentThread.Abort();        //当前线程(子线程)终止          

        }

委托其实就是充当方法的签名,这里委托的参数就是一个方法名,这个方法名带有两个参数,和委托参数表是一样的,同时返回类型也是一样!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void Update(string data,int progress)     //在info标签上显示载入信息

        {

            this.info.Text = data.ToString();

            this.progressBar.Value = progress;

     }

就这样我们绕了一圈,“间接”得通过委托访问主线程构建的控件。

本文只是抛砖引玉,可以了解一下线程和委托的好处。当然,线程并不是越多越好,否则只会增加系统开销,应该看实际需要来应用。

注:如有疏漏之处请指教,谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2008-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 多线程详细讲解「建议收藏」
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
全栈程序员站长
2022/11/01
2.1K0
invoke和begininvoke 区别——c#
      https://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html
vv彭
2020/12/16
2.8K0
invoke和begininvoke 区别——c#
C#中Invoke的用法()
一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。
vv彭
2020/12/11
2.4K0
c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象。由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧。
zls365
2020/12/31
1.9K0
多线程,异步委托,同步委托几种方式的区别
public delegate void DoThingsDelegate();         private void Window_Loaded(object sender, RoutedEventArgs e)         {             //通过子线程调用方法  按钮事件可以执行             Thread a = new Thread(new ThreadStart(DoSomeThing));             a.IsBackground = true;   
liulun
2022/05/09
4010
Java多线程学习(五)线程间通信知识点补充
我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide
用户2164320
2018/06/22
5970
Java多线程学习(五)线程间通信知识点补充
C#基础知识学习之 ☀️ | 多线程的使用基础
线程在程序中经常被用到,现在的计算机都是可以异步执行很多操作的,所以多线程的作用可见一斑!
呆呆敲代码的小Y
2021/10/29
7990
C#基础知识学习之 ☀️ | 多线程的使用基础
c#跨线程访问控件
任务1和任务2采用两个线程,将每次运算结果显示在lable中,我们先按自己的思路写下看能不能实现。
MaybeHC
2024/04/23
1320
c#跨线程访问控件
C# this.invoke()作用 多线程操作UI
Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();
zls365
2020/08/19
3.8K0
新学C#线程使用总结建议收藏
线程的使用其实很简单,和JAVA里面差不多,但是还是有很多特别的地方,在C#中的线程,如果要对非线程创建的控件进行操作的话,就会有异常,所以需要使用委托来对其他控件进行操作。
全栈程序员站长
2022/07/15
1750
C#委托和事件
         通常,一个C语言学习者登堂入室的标志就是学会使用了指针,而成为高手的标志又是“玩转指针”。指针是如此奇妙,通过一个地址,可以指向一个数,结构体,对象,甚至函数。最后的一种函数,我们称之为“函数指针”(和“指针函数”可不一样!)就像如下的代码:
yaphetsfang
2020/07/30
8280
C#委托和事件
C#基础知识回顾--线程传参
  在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值。如果希望传递参数给执行函数,则可以使用带参数的ParameterizedThreadStart委托, public delegate void ParameterizedThreadStart(Object obj) 可以将要传送给线程函数的信息封装为一个对象,然后调用Thread类的以下构造函数  public Thread (Parameterized
hbbliyong
2018/03/05
8790
多线程学习进程
在一个程序中只允许一个主线程(cpu分配的)来执行不同的任务。简而言之就是一个任务一个人独干,在没有干完之前不回去做其他的,直到当前的任务做完。会导致“假死现象”。
wfaceboss
2019/04/08
7100
多线程编程学习三(线程间通信).
一、概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一。可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督。 二、等待/通知机制 1、"wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行。用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有“等待”(wait)的
JMCui
2018/03/16
7280
多线程编程学习三(线程间通信).
子线程调用UI线程的方法
vs2005中,子线程不允许使用UI中的控件,网上的解决方法都有:使用控件的Invoke,不过在我自己的应用中总觉得麻烦:我要从子线程中调用一个主线程中的处理,要用一次委托,而Invoke还要用委托,绕来绕去,把人绕的很晕。我稍微改了一下结构,可以比较方便的达到在子线程中调用UI线程中的处理函数。 在线程类中,定义 public delegate void ReceivedHandlerUI(object obj);     //接收处理,涉及UI 使用两个变量,第二个只要是界面中的任意控件都行,主要是利
用户1075292
2018/01/23
1.3K0
.NET Thread、Task或Parallel实现多线程的使用总结
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
郑子铭
2023/08/30
3460
.NET Thread、Task或Parallel实现多线程的使用总结
多线程
3.开启线程不能用run()方法,用run()只是调用搞线程类的方法,并不是开启线程
xiaozhangStu
2023/05/04
2990
wpf线程进度控制
C#线程为单线程模式,所有界面资源线程之间不能共享,对于主线程中后台代码业务处理比较耗时的情况下,需要添加新的线程处理另外一些界面效果。
sofu456
2019/07/09
8400
.NET简谈组件程序设计之(初识.NET线程Thread)
多线程在我们日常开发过程中用的很多,上一篇“.NET简谈组件程序设计之(异步委托) ”详细的讲解了基于委托的多线程使用,委托是基于后台线程池的原理,这篇文章将主要介绍直接使用Thread对象来实现多线程。
王清培
2022/03/14
3240
.NET简谈组件程序设计之(初识.NET线程Thread)
.NET中的异步编程上
开篇 异步编程是程序设计的重点也是难点,还记得在刚开始接触.net的时候,看的是一本c#的Winform实例教程,上面大部分都是教我们如何使用Winform的控件以及操作数据库的实例,那时候做的基本都是数据库的demo,数据量也不大,程序在执行的时候基本上不会出现阻塞的情况。随着不断的深入.net,也开始进入的实战,在实际的项目,数据量往往都是比较大,特别是在大量的数据入库以及查询数据并进行计算的时候,程序的UI界面往往卡死在那里,发生了阻塞,这时候就需要对计算时间限制的过程进行异步处理,让UI线程继续相应
逸鹏
2018/04/10
1.3K0
.NET中的异步编程上
相关推荐
C# 多线程详细讲解「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验