C#进阶(多线程相关)

news2025/3/19 21:04:08

1。进程?

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,【是系统进行资源分配的基本单位】,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,【进程是线程的容器】。程序是指令、数据及其组织形式的描述,进程是程序的实体。

概括:

进程是程序运行的环境。进程是线程的容器。一个进程可以包含多个线程。
进程是系统进行资源分配的基本单位,而线程是系统进行资源分配的最小单位(线程不能再分)。

A。Thread多线程对象:

实例化Thread t1 = new Thread(两种委托),没有参数委托;带传递参数委托

多线程管理(被开发者诟病)
启动:t1.Start(向线程传递的数据)
中止:t1.Abort()
挂起:t1.Suspend()
重启:t1.Resume()

多线程的状态: UnStarted未启动, Running运行中, Suspended已挂起, Aborted已中止, Stoped已停止, …

多线程等待: t1.Join(毫秒数), Thread.Sleep(毫秒数)

B。Thread重要属性:

IsAlive 线程状态是否是存活。true存活
IsBackground 是否是后台线程。true后台
ThreadState 线程状态,比IsAlive范围大。
CurrentThread 当前执行的线程。
Name 线程名称
Priority 线程优先级

C。Thread重要方法:

new Thread(两种委托) 构造函数 ThreadStart和ParameterizedThreadStart
t.Start()启动
t.Abord()中止
t.Suspend()挂起
t.Resume()重新开始
t.Join(毫秒数)线程终止前,阻止调用线程
Thread.Sleep(毫秒数)线程休眠,延迟

Thread线程类缺点是不好用(不好控制),如果创建多个线程时,更不好管理。ThreadPool比Thread好一些,但也好不到那去。
线程锁:相对复杂

下载技术:HttpWebRequest(旧) WebRequest(旧), HttpClient(新),WebClient(新)。

窗体设计
在这里插入图片描述


Thread thread1 = null;
//启动
private void button3_Click(object sender, EventArgs e)
{
    thread1 = new Thread(() =>
    {
        long n = Fibonacci(40);
        Console.WriteLine(n);
        Console.WriteLine("一个线程");
        Invoke(new Action(() => label1.Text = n.ToString()));
    });            
    Console.WriteLine("启动");
    Console.WriteLine(thread1.ThreadState);
    thread1.Start();
    Console.WriteLine(thread1.ThreadState);
}
//暂停
private void button6_Click(object sender, EventArgs e)
{
    Console.WriteLine("暂停");
    Console.WriteLine(thread1.ThreadState);
    thread1?.Suspend();
    Console.WriteLine(thread1.ThreadState);
}
//重启
private void button5_Click(object sender, EventArgs e)
{
    Console.WriteLine("重启");
    Console.WriteLine(thread1.ThreadState);
    thread1?.Resume();
    Console.WriteLine(thread1.ThreadState);

}
//停止
private void button4_Click(object sender, EventArgs e)
{
    Console.WriteLine("停止");
    thread1.Abort();
}
//裴波那契数列
public static long Fibonacci(int n)
{
    if (n < 0)
        throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");

    // 基准情况
    if (n == 0) return 0;
    if (n == 1) return 1;

    // 纯递归调用
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}  

依次点击输出结果
在这里插入图片描述

2。线程?

线程(英语:Thread)是操作系统能够进行 【运算调度的最小单位】 。它被包含在进程之中,是进程中的实际运作单位。【一条线程指的是进程中一个单一顺序的控制流】,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

概括:

线程是操作系统资源调度的最小单位。线程不能独立运行,必须包含在进程中。进程中可以包含多个线程。多线程执行时是并行(异步),无序的。

串行===>排队===>阻塞(同步) 并行===>无序===>非阻塞(异步)

线程之间要通讯。会有两种方案:同步和异步。

单个线程中能不能异步?可以

【多线程肯定是异步。异步不一定是多线程。】

多线程中有N个线程,但主线程只有一个,其他的线程都称为分线程。对于单线程程序来说,程序中只有一个线程,这个线程就是主线程。

3。多线程概念?优点及缺点?

多线程是指程序中包含多个执行流(线程),即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

概括:

多线程让程序同时运行多个线程,多个线程并行执行(执行时无顺序)

优点:

可以提高CPU的利用率。大大提高了程序的运行效率,用户体现好,粘性高。

缺点:

a.线程也是程序,所以线程运行需要占用计算机资源,线程越多占用资源也越多。(占内存多)
b.多线程需要协调和管理,所以需要CPU跟踪线程,消耗CPU资源。(占cpu多)
c.线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。(多线程存在资源共享问题 锁)
d.线程太多会导致控制太复杂,最终可能造成很多Bug。(管理麻烦,容易产生bug)

死锁:某个资源不能空闲。

4。线程池?

.NET Framework2.0时代,出现了一个线程池ThreadPool,是一种池化思想,如果需要使用线程,就可以直接到线程池中去获取直接使用,如果使用完毕,在自动的回放到线程池去;

C#锁推荐

窗体设计
在这里插入图片描述
关键代码

 private void btnOn_Click(object sender, EventArgs e)
 {
     //workerThreads,最大线程数。completionPortThreads,活动线程数。
     ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
     Console.WriteLine(workerThreads);
     Console.WriteLine(completionPortThreads);
     Console.WriteLine("_____________________");
     ThreadPool.GetMaxThreads(out int workerThreads1, out int completionPortThreads1);
     Console.WriteLine(workerThreads1);
     Console.WriteLine(completionPortThreads1);
     Console.WriteLine("_____________________");
     ThreadPool.GetMinThreads(out int workerThreads2, out int completionPortThreads2);
     Console.WriteLine(workerThreads2);
     Console.WriteLine(completionPortThreads2);
     Console.WriteLine("_____________________");
     //ThreadPool线程池,主要把比较耗时的任务放到一个队列中。开发者不用手动管理线程池中的线程。线程池会帮我们自动管理。
     ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc1");
     ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc2");
     ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc3");
 }

1点击结果
在这里插入图片描述

 private void btnWait_Click(object sender, EventArgs e)
 {
     //建议使用:Monitor(语法糖lock关键字),Mutex(互斥锁),Event,Semaphore代替Suspend和Resume
     ManualResetEvent resetEvent = new ManualResetEvent(false);
     ThreadPool.QueueUserWorkItem(o =>
     {
         //锁资源 lock(资源){},当线程用完资源后,释放资源,资源才能被其他线程使用。
         //只有一个分线程时,不建议去锁资源。
         lock (o)
         {
             //分线程的代码是有序的,线程和其他线程的执行是无序的,想有序借助优先级。
             this.DoSomething(o.ToString());
             resetEvent.Set();//在分线程中通过ManualResetEvent类的Set方法,可以向主线程发送信号
         }
     }, "执行分线程");
     resetEvent.WaitOne();//阻塞当前线程,等待分线程的Set()执行,才会继续执行
     Console.WriteLine("主线程执行完毕");
 }

2点击结果
在这里插入图片描述

 private void button1_Click(object sender, EventArgs e)
 {
     ManualResetEvent resetEvent = new ManualResetEvent(false);
     ThreadPool.QueueUserWorkItem(data =>
     {
         int num = (int)data;
         long result = Fibonacci(num);
         Invoke(new Action(() =>
         {
             Console.WriteLine(result);
             label1.Text = result.ToString();
         }));
         resetEvent.Set();
     }, 40);
 }

3点击结果
在这里插入图片描述

  private void DoSomething(string v)
 {
     Thread.Sleep(10000);
     Console.WriteLine(v);
 }

 public static long Fibonacci(int n)
 {
     if (n < 0)
         throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");

     // 基准情况
     if (n == 0) return 0;
     if (n == 1) return 1;

     // 纯递归调用
     return Fibonacci(n - 1) + Fibonacci(n - 2);
 }

概括:

.net 2.0出现线程池,线程池中可以存在多个线程,让线程池来自动管理(垃圾回收器GC和公共语言运行时CLR)。

好处:解决了部分Thread管理不便的问题,移除了无用的Thread API。提高线程运行性能。

重要API:QueueUserWorkItem(Callback,data)

5。Task任务?

Task在.net 4.0时出现,是在线程池基础上封装而来的,提供了对线程的延续,取消,等待,超时等方面功能。

6。取消任务?

CancellationTokenSource类,CancellationToken结构
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel()、cts.IsCancellationRequested属性、cts.Token属性

7。延迟,等待?

Task.Delay(100).Wait(); // 延迟并等待,注意延迟执行也是异步的。
t.Wait() //等待,会阻塞主线程
Task.WaitAny()等待任务数组中任意一个任务完成。result任务数组中第一个完成的任务索引。
Task.WaitAll()等待所有的任务完成,没有返回值
Task.WhenAny()当任务数组中任意一个任务完成的时候,去做其他事情 。返回值Task
Task.WhenAll()当任务数组中所有任务都完成的时候,才去做其他事情 。返回值Task

8。拿分线程结果?分线程向主线程传值?

t.Result属性 配合 Task

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

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

相关文章

【C++】:C++11详解 —— 右值引用

目录 左值和右值 左值的概念 右值的概念 左值 vs 右值 左值引用 和 右值引用 左值引用 右值引用 左值引用 vs 右值引用 使用场景 左值引用的使用场景 左值引用的短板 右值引用的使用场景 1. 实现移动语义&#xff08;资源高效转移&#xff09; 2. 优化容器操作&a…

【css酷炫效果】纯CSS实现虫洞穿越效果

【css酷炫效果】纯CSS实现穿越效果 缘创作背景html结构css样式完整代码基础版进阶版&#xff08;虫洞穿越&#xff09; 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90491973 缘 创作随缘&#xff0c;不定时…

Linux IP 配置

Linux IP 配置 1 环境介绍2 网卡信息配置3 使用nmtui工具配置4 更多Linux命令学习使用列表 1 环境介绍 虚拟机&#xff0c;服务器安装系统完成后&#xff0c;先要配置ip 地址&#xff0c;这样可以方便远程若是物理服务器一般会有4个网卡信息麒麟v10&#xff0c;CentOS7&#x…

基于 SSE 和 WebSocket 的在线文本实时传输工具

简介 在线文本实时传输工具支持 SSE&#xff08;Server-Sent Events&#xff09; 和 WebSocket&#xff0c;可在不同设备间快速共享和同步文本&#xff0c;适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步&#xff1a;文本输入后&#xff0c;另一端用户可立即看到…

数图亮相第三届全国生鲜创新峰会,赋能生鲜零售数字化转型

2025年3月15-18日&#xff0c;第三届全国生鲜创新峰会在湖北宜昌召开&#xff0c;主题为“生鲜破局&#xff0c;重塑价值”。峰会汇聚行业专家、企业领袖及精英&#xff0c;探讨生鲜零售新机遇与挑战。作为领先的“智慧零售”服务商&#xff0c;数图信息科技受邀出席&#xff0…

go 安装swagger

1、依赖安装&#xff1a; # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入&#xff1a; swag -v 3、…

CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试

目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后&#xff0c;进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…

从C语言开始的C++编程生活(1)

前言 本系列文章承接C语言的学习&#xff0c;需要有C语言的基础才能学会哦。 第1篇主要讲的是有关于C的命名空间、输入和输出。 C才起步&#xff0c;都很简单呢&#xff01; 目录 前言 命名空间namespace 基本语法 作用 使用命名空间 域作用限定符 :: 基本语法 using n…

Python F-String 深度解析:原理、用法与最佳实践

# Python F-String 深度解析&#xff1a;原理、用法与最佳实践 ## 一、引言 Python 的 F-String&#xff08;格式化字符串字面值&#xff09;自 3.6 版本引入以来&#xff0c;凭借其简洁性和高效性&#xff0c;迅速成为字符串格式化的首选方案。本文将从原理、核心用法和编码规…

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…

解决uni-app授权弹框华为审核拒绝

背景&#xff1a; 在使用定位、相机、文件、电话&#xff0c;需要用户同意授权时&#xff0c;华为和vivo需要告知用户使用权限目的。 方案&#xff1a; 在uni授权时&#xff0c;弹框告诉授权目的&#xff0c;效果如下&#xff1a; 代码&#xff1a; const perListener {//…

施耐德PLC仿真软件Modbus tcp通讯测试

安装仿真软件&#xff1a;EcoStruxure™ Control Expert - PLC 仿真器 下载地址&#xff1a;https://www.schneider-electric.cn/zh/download/document/EIO0000001719/ 配置CPU&#xff1a; 切换至仿真模式&#xff0c;系统托盘中出现仿真器图标 新建变量test&#xff0c;地址…

1.排序算法(学习自用)

1.冒泡排序 算法步骤 相邻的元素之间对比&#xff0c;每次早出最大值或最小值放到最后或前面&#xff0c;所以形象的称为冒泡。 特点 n个数排序则进行n轮&#xff0c;每轮比较n-i次。所以时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)&#xff0c;该排序算法稳定。 代码…

vs2017版本与arcgis10.1的ArcObject SDK for .NET兼容配置终结解决方案

因电脑用的arcgis10.1,之前安装的vs2010正常能使用AO和AE&#xff0c;安装vs2017后无法使用了&#xff0c;在重新按照新版本arcgis engine或者arcObject费时费力&#xff0c;还需要重新查找资源。 用vs2017与arc10.1的集成主要两个问题&#xff0c;1&#xff1a;安装后vs中没有…

基于yolo11+flask打造一个精美登录界面和检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示&#xff0c;代码仅仅有2个html文件和一个python文件&#xff0c;真正做到了用最简洁的代码实现复杂功能。 测试通过环境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

用 Vue 3.5 TypeScript 重新开发3年前甘特图的核心组件

回顾 3年前曾经用 Vue 2.0 开发了一个甘特图组件&#xff0c;如今3年过去了&#xff0c;计划使用Vue 3.5 TypeScript 把组件重新开发&#xff0c;有机会的话再开发一个React版本。 关于之前的组件以前文章 Vue 2.0 甘特图组件 下面录屏是是 用 Vue 3.5 TypeScript 开发的目前…

深入解析 SQL 事务:确保数据一致性的关键

SQL 事务 什么是 SQL 事务&#xff1f;事务的 ACID 特性原子性&#xff08;Atomicity&#xff09;:示例&#xff1a; 一致性&#xff08;Consistency&#xff09;:示例&#xff1a; 隔离性&#xff08;Isolation&#xff09;:持久性&#xff08;Durability&#xff09;:示例&am…

基于STM32的火灾报警设备(阿里云平台)

目录 前言&#xff1a; 一、项目介绍和演示视频 二、硬件需求准备 三、硬件框图 1. 原理图 2. PCB 四、CubeMX配置 五、代码框架 前言&#xff1a; 源代码下载链接&#xff1a; https://download.csdn.net/download/m0_74712453/90474701 需要实物的可以私信博主或者…

FPGA-流水灯

Quartus中使用Verilog实现 根据之前所学内容&#xff0c;打开Quartus 软件&#xff0c;新建FPGA项目文件&#xff0c;建立好空项目过后&#xff0c;选择Verilog HDL File&#xff0c;因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客&#xff1a; FPGA 实验报告&a…

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为&#xff1a; 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…