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

news2024/11/15 7:23:56

这和前面的学习内容可能有点不太连贯,但是呢我们一般来说的学习就是遇到什么困难就去学习什么,这也是为什么看那些循序渐进的教程虽然学的很饱满,但是我们有时会学了前面忘记了后面,或者对某个板块理解不深,乃至于写代码虽然能看懂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.coloradmin.cn/o/2120626.html

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

相关文章

递归搜索与回溯专题篇二

目录 N皇后 有效的数独 解数独 单词搜索 黄金矿工 不同路径III N皇后 题目 思路 根据题意可知&#xff0c;要想得到n皇后的摆放方案&#xff0c;结果须满足每一行及每一列都只有一个皇后&#xff0c;且每个主对角线和副对角线上只能有一个皇后&#xff0c;我们的做法是&…

STM32单片机 定时器TIM输出比较 PWM波形

一. OC&#xff08;Output Compare&#xff09;输出比较 了解&#xff1a;IC&#xff08;Input Capture&#xff09;输入捕获、CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较单元功能&#xff1a;用来输出PWM波形&#xff0c;PWM波形又是用来驱动电机的必要条…

2008-2022年各省环境污染综合指数数据(含原始数据+计算结果)

2008-2022年各省环境污染综合指数数据&#xff08;含原始数据计算结果&#xff09; 1、时间&#xff1a;2008-2022年 2、来源&#xff1a;统计年鉴、各省年鉴、环境年鉴 3、指标&#xff1a;省份、年份、废水排放总量&#xff08;万吨&#xff09;、废气中二氧化硫排放量&am…

系统架构设计师 - 系统可靠性分析与设计

系统可靠性分析与设计 系统可靠性分析与设计&#xff08;论文写作&#xff09;可靠性相关基本概念 ★★系统可靠性分析 ★★★★可靠性指标串联系统与并联系统 软件可靠性设计 ★★★★影响软件可靠性的主要因素可靠性设计策略N 版本程序设计防卫式程序设计 双击容错 大家好呀&…

公共场所团队管理-手机端源码讲解--SAAS本地化及未来之窗行业应用跨平台架构

一、团队自主注册码 二、代码 var 二维码 "未来之窗?url"encodeURIComponent(url);var 图片 "<img src"二维码">";CyberWin_Dialog.layer(图片,{type:"frame",title:title,width:"320px",height:"320px"…

从阅读到编辑,全方位PDF编辑器软件功能探索

你现在收到的文件是不是大部分也都是PDF格式的&#xff1f;这个格式可以完整的保存任意Office软件制作文档的格式&#xff0c;但是编辑起来就不是那么方便了。这次我汇集了一些我和身边小伙伴常用的类似福昕高级pdf编辑器这样的编辑工具统统分享给你吧。 1.福昕PDF编辑器 链接…

蚁剑webshell连接报错A JavaScript error occurred in the main process

报错如图&#xff1a; 已知解决方式&#xff1a; 将上传shell中文文件名修改为任意的英文文件名即可连接。

数据库体系结构概述

文章目录 1、集中式数据库2、分布式数据库2.1、体系结构2.2、特性2.3、分片方式2.4、透明性2.5、两阶段提交协议 2PC 1、集中式数据库 三级模式 外模式: 也称用户模式&#xff0c;对应 用户视图模式&#xff08;概念模式&#xff09;: 对应数据库表&#xff08;关系表&#xff…

读软件设计的要素06概念完整性

1. 概念完整性 1.1. 当概念组合成一个软件时&#xff0c;它们可以同步以便协调行为 1.1.1. 同步可能会消除一个概念的某些行为&#xff0c;但决不会添加与该概念的规范不一致的新行为 1.1.2. 在使用概念设计软件时&#xff0c;即使你没有精确定义同步&#xff0c;至少要说服自…

二进制方式安装Helm

二进制方式安装Helm 官网&#xff1a;https://helm.sh/ 1、下载安装包 wget -L https://get.helm.sh/helm-v3.16.0-rc.1-linux-amd64.tar.gz2、解压 tar -xf helm-v3.16.0-rc.1-linux-amd64.tar.gz3、移动到/usr/local/bin/目录下 mv linux-amd64/helm /usr/local/bin/he…

ResNet结构图(ResNet18、ResNet50)

原理&#xff1a;利用conv将通道数逐渐增加&#xff0c; 图片尺寸逐渐缩小 ResNet18结构图 ResNet18中的"18"指的是网络中的加权层数量。具体来说&#xff0c;它包含了18个卷积层和全连接层。 ResNet18的架构包括&#xff1a; 1个7x7卷积层16个3x3卷积层&#xf…

echarts饼图

const payload {id: left-center-1,title: 年龄占比,toolTip: true,data: {total: 197,data: [1, 32, 57, 67, 40],x: [35岁以下, 35-40岁, 40-45岁, 45-50岁, 50岁以上],}, };data [];// const color [#2F7DF2, #F9CA3C, #2E5CF2, #34E9A3, #F63048, #F97A3C, #2FD9F2, #A9…

IOS 开发者账号注册流程

注册步骤 准备资料 营业执照 法人信息&#xff08;电话、身份证信息&#xff09; 注册邮箱&#xff08;公司邮箱&#xff09; 开发者信息&#xff08;电话、身份证信息、邮箱&#xff09;1. 注册AppleID 注册地址&#xff1a; https://appleid.apple.com/account 填写表单信…

杂谈|压力管理之认识「压力」(一)

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、腾讯云TDP-KOL、ACDU成员、墨天轮技术专家博主 &#x1f52…

曾经的王者-腾讯公众号为什么不火了呢?

微信公众号&#xff0c;曾经是图文内容创作者的天堂&#xff0c;如今却似乎风光不再。随着短视频和直播等新型媒体形式的崛起&#xff0c;公众号的打开率连年下滑&#xff0c;粉丝负增长甚至成为一些账号的常态。为何曾一度被誉为“图文类博主巅峰”的公众号会陷入如此境地&…

中国碳排放交易试点城市名单DID(2000-2022年)

中国碳排放交易试点城市名单DID数据是一个重要的工具&#xff0c;用于研究中国碳排放交易试点政策的影响。这些数据通常包括了各个试点城市在政策实施前后的虚拟变量&#xff0c;可以用于计量经济学分析&#xff0c;如双重差分&#xff08;DID&#xff09;方法&#xff0c;以评…

自学半年LabVIEW,能搭建出来一个系统吗

自学半年 LabVIEW 是完全有可能搭建出一个系统的&#xff0c;具体取决于你的学习效率、项目的复杂性以及你投入的时间。以下一些内容&#xff0c;能帮助你评估在半年时间内是否可以搭建出一个功能完善的系统&#xff1a; 1. 学习基础和背景 如果你已经具备编程或工程背景&…

服务器深度学习环境配置

学校提供的服务器&#xff0c;参考意见比较低 目录 公有云操作云主机操作系统修改&#xff1a; xshell连接深度学习环境配置显卡驱动检查安装检查 CUDA检查CUDA下载配置环境变量检查 conda 公有云操作 打开控制中心 节点选择 山东-青岛20 打开弹性云主机 云主机 系统已经默认…

Flutter类

Dart中的对象都继承自 Object 类&#xff0c;单继承&#xff08;extend关键字&#xff09;。Dart与Java、kotlin不同的是其无public、private、protected修饰符&#xff0c;默认public &#xff0c;通过在属性名、方法名前加 _下划线 来定义是否私有。 实现一个简单的类 class…

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

&#x1f3af;要点 &#x1f3af;受激发射损耗显微镜算法模型&#xff1a;&#x1f58a;恢复嘈杂二维和三维图像 | &#x1f58a;模型架构&#xff1a;恢复上下文信息和超分辨率图像 | &#x1f58a;使用嘈杂和高信噪比的图像训练模型 | &#x1f58a;准备半合成训练集 | &…