C#笔记8 线程是什么?多线程怎么实现和操作?

这和前面的学习内容可能有点不太连贯,但是呢我们一般来说的学习就是遇到什么困难就去学习什么,这也是为什么看那些循序渐进的教程虽然学的很饱满,但是我们有时会学了前面忘记了后面,或者对某个板块理解不深,乃至于写代码虽然能看懂ai的解释,却不能融会贯通。

就好像现在:我学习网络通信,却遇到了关于同步异步的问题,虽然本科时有粗略学习过一系列多线程之类的概念,但是在具体问题中发现远远不够,十分迷糊。于是决定学习这一章。

线程是什么?

每个操作系统上运行的应用程序都是一个进程,一个进程可以包括一个或多个线程。

线程是操作系统分配处理器时间的基本单元。

在进程中可以有多个线程。

线程上下文

线程上下文是指保证线程在宿主进程地址空间中无缝继续运行所必须得所有信息。

单线程

只有一个线程,从头执行到尾的程序叫做单线程程序,默认情况下系统会给应用程序分配一个入口也就是常见的Main方法。如果你新建一个winform程序,你可以搜索Main方法看看它创建了什么。

    internal static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}}

怎么样?一个窗体界面运行在一个线程,于是我们在其他线程中,比如网络操作,文件读写的线程中如果修改这里的窗体界面,会报一个很常见很常见的错误哦。

 当然,这个我们后面再说。

什么是多线程?

很好,我们刚刚说过了,用户界面在一个线程上运行,我们又知道,线程是分配处理器时间的最小单元,那么如果我们只有一个线程,如果遇到一个任务需要很长时间,就只能等待这个事情做完了,相应的,我们的用户界面也会卡住了,这是古早一些软件的常见情况,点击一个按钮触发了事件之后,很长一段时间都没有反应。。。

于是我们就尝试使用多个线程来运行我们的程序,遇到需要占用时间的事情我们就新开一个线程,然后给他扔到我们的后台去。这样我们前台的用户界面就不会卡顿,还能继续处理用户的其他操作,这可比原来强多了。

多线程的常用场景

举几个例子:

网络通信服务,毫无疑问咯,网络的延迟是很不稳定的因素,乃至于传输文件,都是既耗时又占用资源的操作,其中有很多需要线程间的交互。这也是我们上一节为什么没有继续学习的原因。

数据库操作,这个就不需要我们多说了,用户界面中展示的数据来自于数据库的情况实在是太常见了,一般来说我们会提供用户操作数据库的几个方法,但是这些操作数据库的方法也许会比较耗时,比如大批量复制和排序,乃至于与网络通信结合,与云数据库通信。

多线程的限制

当然不是说:多线程实在是太厉害了,我们一定要多使用多线程,这样我们就能同时运行好多任务啦!实际上不是这样的,多线程优点很多,缺点也是存在的,

首先是占用内存,其次是太多线程会占用大量的处理器时间,会导致线程之间互相影响,都不会有太多的进度。

对于程序员来说,线程太多管理起来也是麻烦,还有可能产生许多bug。

线程的实现

Thread类

此类属于System.Threading命名空间下。

Thread 类 (System.Threading) | Microsoft Learn

属性:

ApartmentState	
已过时.
获取或设置此线程的单元状态。CurrentCulture	
获取或设置当前线程的区域性。CurrentPrincipal	
获取或设置线程的当前负责人(对基于角色的安全性而言)。CurrentThread	
获取当前正在运行的线程。CurrentUICulture	
获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。ExecutionContext	
获取 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。IsAlive	
获取指示当前线程的执行状态的值。IsBackground	
获取或设置一个值,该值指示某个线程是否为后台线程。IsThreadPoolThread	
获取指示线程是否属于托管线程池的值。ManagedThreadId	
获取当前托管线程的唯一标识符。Name	
获取或设置线程的名称。Priority	
获取或设置指示线程的调度优先级的值。ThreadState	
获取一个值,该值包含当前线程的状态。

创建线程

构造函数

创建线程的构造函数有好几个,但是无一例外需要一个参数:委托,事实上就是告诉线程执行什么。其中传递的委托可以是ThreadStart的实例。

Thread(ParameterizedThreadStart)	
初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。Thread(ParameterizedThreadStart, Int32)	
初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小。Thread(ThreadStart)	
初始化 Thread 类的新实例。Thread(ThreadStart, Int32)	
初始化 Thread 类的新实例,指定线程的最大堆栈大小。

举例:

下面就是初始化一个线程,然后启用它的例子。

public void serverstart()
{//开启服务端线程mywaitthread = new Thread(new ThreadStart(serverrun));mywaitthread.Start();tm_checkmessage1.Start();}

释放线程

一般来说,我们创建的线程和系统自动给的线程一样,在执行完任务之后会自动释放。

但是如果线程具有循环的特性就需要我们给一个跳出循环的点。

或者是线程执行时间太长,我们需要手动释放。此时使用:

if (myclientthread != null)
{if (myclientthread.ThreadState == ThreadState.Running){myclientthread.Abort();}
}

Abort方法可以引发结束线程的过程。一般来说这会导致线程的结束。

如此我们就知道怎么使用一个线程来执行我们预设的方法了,但是这是最简单的,也可以说是最好理解的多线程或者说不同于单线程的逻辑。

我们只是把我们程序从一条线,在某个节点,引出一条另外的线罢了。线程之间的交互,线程的状态我们都没有去详细解释。

明天会试图弄懂更多的程序执行的流程逻辑,尤其是:异步,同步这两个概念在很多面试官眼中的地位可以说很高很高的东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学物理实验-杨氏双缝干涉实验

一、实验目的 1.理解杨氏双缝干涉现象的基本原理&#xff1b; 2.掌握用光具座调整杨氏双缝干涉装置的光路&#xff1b; 3.用CCD观察杨氏双缝干涉的实验现象&#xff1b; 4.学会用干涉法测量未知光波的波长。 二、仪器用具 FB760-6型光学实验仪多功能光学片 三、实验原理 1.波…

智能提取:OfficeImagesExtractor让文档图片提取更简单

“科技是国之利器&#xff0c;也是民之福祉。” 在数字化办公日益普及的今天&#xff0c;我们对文档处理的需求也在不断增长。尤其是对于Office文档中的图片、视频和音频等多媒体内容的提取&#xff0c;传统的方法是繁琐且效率低下的。在这样的背景下&#xff0c;一款能够高效、…

计算机毕业设计选题推荐-产品委托配送系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

视频监控管理平台LntonAIServer视频智能分析噪声检测应用场景

在视频监控系统中&#xff0c;噪声问题常常影响到视频画面的清晰度和可用性。噪声可能由多种因素引起&#xff0c;包括但不限于低光环境、摄像机传感器灵敏度过高、编码压缩失真等。LntonAIServer通过引入噪声检测功能&#xff0c;旨在帮助用户及时发现并解决视频流中的噪声问题…

原点安全荣获“AutoSec Awards 安全之星”优秀汽车数据安全合规方案奖

9月3日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大开幕。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;汇聚了国内外的技术专家、…

宏观学习笔记:GDP分析(二)

GDP分析&#xff08;一&#xff09;主要是介绍GDP相关的定义以及核算逻辑&#xff0c;本节主要介绍GDP的分析思路。GDP分析主要是2种方法&#xff1a;总量分析和结构分析。 1. 总量分析 1.1 数值选择 一般情况下&#xff0c;分析的对象都是 官方公布的GDP当季值。 1.2 趋势规…

全国-住宅区AOI数据

数据量级&#xff1a;54万&#xff0c;更新时间&#xff1a;2024年3月 覆盖字段&#xff1a; 名称&#xff0c;地址&#xff0c;经纬度&#xff0c;一级分类&#xff0c;二级分类&#xff0c;三级分类&#xff0c;默认图片&#xff0c;AOI围栏 数据来源于&#xff1a;魔行观察…

AIGC与数据分析融合,引领商业智能新变革(TOP企业实践)

AIGC与数据分析融合&#xff0c;引领商业智能新变革&#xff08;TOP企业实践&#xff09; 前言AIGC与数据分析融合 前言 在当今数字化时代&#xff0c;数据已成为企业发展的核心资产&#xff0c;而如何从海量数据中挖掘出有价值的信息&#xff0c;成为了企业面临的重要挑战。随…

开放式耳机具备什么特点?2024排行前十的四款百元蓝牙耳机推荐

开放式耳机具有以下特点&#xff1a; 佩戴舒适&#xff1a; 开放式耳机通常不需要插入耳道&#xff0c;能减少对耳道的压迫和摩擦&#xff0c;长时间佩戴也不易产生闷热、疼痛或瘙痒等不适&#xff0c;对于耳道敏感或不喜欢入耳式耳机压迫感的人来说是很好的选择。 这类耳机…

ZBrush与Blender雕刻功能哪个更好些?

选择正确的3D软件首先会让你的创作过程更加轻松&#xff0c;尤其是在动画或大片电影制作方面。不同的软件提供不同的功能&#xff0c;并倾向于专注于特定领域&#xff0c;如绘画、动画或雕刻。如果你选择了适合你风格和目标的软件&#xff0c;你可以创作出极具创意的作品。 在…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制1. 前言2. 项目环境搭建3. 项目路由机制3.1. 1&#xff09;先搜索pom.xml文件&#xff0c;看看使用了什么框架3.2. 2&#xff09;确定是否是spring的路由机制3.3. 3&#xff09;确定自写路由机制的…

golang学习笔记05——golang协程池,怎么实现协程池?

推荐学习文档 golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&#xff1f; 协程池是一种用于高效处理任务的机制&…

苏茵茵:以时尚之名,诠释品质生活

在女性追求个性化与自我表达的今天&#xff0c;时尚早已超越了简单的穿着打扮&#xff0c;它成为女性展现自我风格、彰显独特魅力的重要方式。从广泛的兴趣爱好到精心雕琢的个人风格&#xff0c;每一处细节都闪耀着女性对个性独特与自我表达的深切渴望。正是这股不可阻挡的潮流…

Java 中常用内置接口函数

在 Java 8 及以后的版本中&#xff0c;引入了许多函数式编程的特性&#xff0c;其中最重要的就是内置的函数式接口。这些接口使得编写更简洁、可读性更强的代码成为可能。今天我将介绍四个常用的内置接口&#xff1a;Predicate、Function、Consumer 和 Supplier&#xff0c;并提…

ffmpeg 视频编码及基本知识

理论 H264编码原理&#xff08;简略&#xff09; 1. 视频为什么需要进行编码压缩 降低视频数据大小&#xff0c;方便存储和传输 2. 为什么压缩的原始数据采用YUV格式 彩色图像的格式是 RGB 的&#xff0c;但RGB 三个颜色是有相关性的。 采用YUV格式&#xff0c;利用人对图像的…

【C语言必学知识点七】什么?还有人不知道什么是柔性数组?还不速来!!!

动态内存管理——详细解读柔性数组 导读一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了C/C程序中的内存分区&#xff0c;在C/C…

C++11 --- 可变参数模板

序言 不知道大家有没有细细研究过在 C 语言 中的 printf 函数&#xff0c;也许我们经常使用他&#xff0c;但是我们可能并不是那么了解他。先看一下调用格式&#xff1a;int printf ( const char * format, ... );&#xff0c;在这里的 format 代表我们的输出格式&#xff0c;后…

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录&#xff0c;创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源&#xff0c;镜像源在编辑中需要单独复制 h…

华为防火墙 nat64

如果设备接收到的IPv6报文的前缀是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv4网络&#xff0c;报文将经过NAT64处理后被转发至IPv4网络。 如果设备接收到的IPv6报文的前缀不是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv6网络&#xff0c;报文…