掌握 C# 多线程与异步编程
现代应用程序通常需要执行复杂的计算或处理 I/O 操作,这些操作可能会导致主线程阻塞,从而降低用户体验。C# 提供了多线程与异步编程的多种工具,让我们能够高效地并发处理任务。本文将介绍 C# 中的多线程与异步编程,包括 Thread 类、任务并行库、async 和 await 异步编程,以及并行循环和 PLINQ。
1. 线程基础(Thread 类)
在 C# 中,Thread 类用于创建和管理独立的执行路径。每个线程都在单独的 CPU 核心上运行,可以并发处理多个任务。以下是 Thread 类的基本用法:
using System;
using System.Threading;public class Program
{public static void PrintNumbers(){for (int i = 1; i <= 5; i++){Console.WriteLine(i);Thread.Sleep(500); // 模拟工作负载}}public static void Main(){Thread thread = new Thread(PrintNumbers);thread.Start(); // 启动新线程for (int i = 10; i <= 15; i++){Console.WriteLine(i);Thread.Sleep(500);}}
}
在此示例中,主线程和新线程 thread 会并发执行,分别输出 1 到 5 和 10 到 15。
- 优点:
Thread类提供了对底层线程的直接控制。 - 缺点:创建和管理大量线程的开销较大,并且不便于资源管理。
2. 任务并行库(Task Parallel Library)
任务并行库 (Task Parallel Library, TPL) 简化了多线程编程,提供了 Task 类来抽象和管理并发任务。Task 更轻量级,且由运行时负责资源调度。Task.Run 可用于并行执行任务。
using System;
using System.Threading.Tasks;public class Program
{public static void Main(){Task task = Task.Run(() =>{for (int i = 1; i <= 5; i++){Console.WriteLine($"Task: {i}");Task.Delay(500).Wait(); // 模拟工作负载}});task.Wait(); // 等待任务完成Console.WriteLine("Task completed.");}
}
使用 TPL 的好处是,Task 可以简化线程管理,减少代码的复杂性。Task.Wait() 用于等待任务完成,而 Task.WhenAll 和 Task.WhenAny 可以实现多个任务的同步或竞赛。
3. async 与 await 异步编程
C# 提供的 async 和 await 关键字可以帮助我们编写简洁且高效的异步代码。在异步方法中使用 await 可以让方法在等待异步任务完成时不阻塞主线程。
using System;
using System.Threading.Tasks;public class Program
{public static async Task PerformTaskAsync(){Console.WriteLine("Starting task...");await Task.Delay(2000); // 异步等待Console.WriteLine("Task completed.");}public static async Task Main(){await PerformTaskAsync();Console.WriteLine("Program completed.");}
}
在这个示例中,PerformTaskAsync 是一个异步方法,使用 await Task.Delay(2000) 模拟异步任务执行。在等待时,主线程并不会被阻塞,可以处理其他任务。
- 优点:
async和await简化了异步代码编写,避免了回调地狱问题。 - 应用场景:适合需要等待 I/O 操作、网络请求等长时间任务的场景。
4. 并行循环与 PLINQ
并行循环 和 PLINQ(Parallel LINQ) 是 C# 中并行处理数据集合的两种方式,它们在多核系统上能够显著提高处理速度。
并行循环
Parallel.For 和 Parallel.ForEach 可以并行地处理集合中的元素,适合用于处理计算密集型任务。
using System;
using System.Threading.Tasks;public class Program
{public static void Main(){Parallel.For(0, 5, i =>{Console.WriteLine($"Parallel loop: {i}");Task.Delay(500).Wait(); // 模拟工作负载});Console.WriteLine("Parallel loop completed.");}
}
在此示例中,Parallel.For 将 0 到 5 的迭代并行化执行。并行循环适用于处理大量数据的计算密集型任务。
PLINQ
PLINQ(Parallel LINQ)是 LINQ 的并行版本,它允许我们使用 LINQ 查询语法来处理集合,同时利用多核处理器并行执行查询。使用 .AsParallel() 即可将普通 LINQ 查询转为并行处理。
using System;
using System.Linq;public class Program
{public static void Main(){int[] numbers = Enumerable.Range(1, 10).ToArray();var squaredNumbers = numbers.AsParallel().Select(n => n * n).ToArray();foreach (var num in squaredNumbers){Console.WriteLine(num);}}
}
在此示例中,AsParallel() 将查询转换为并行操作,Select 中的运算会在多个线程上同时执行。这使得 PLINQ 特别适合处理大数据集的批量计算。
结论
C# 提供了多种方式来处理并发任务和异步操作,包括 Thread、任务并行库 (TPL)、async 和 await 异步编程、并行循环和 PLINQ。
Thread类 提供了底层线程控制。- 任务并行库 (TPL) 简化了并发任务管理。
async和await提供了简洁的异步编程支持,避免阻塞主线程。- 并行循环 和 PLINQ 适合处理计算密集型的集合数据。
通过掌握这些工具和技术,你可以编写高效、可扩展的多线程和异步 C# 程序,为用户提供更流畅的体验。
这篇博客介绍了 C# 中的多线程与异步编程基础。如果你有进一步的问题或需要更深入的示例,欢迎留言或联系我!
相关文章:
掌握 C# 多线程与异步编程
现代应用程序通常需要执行复杂的计算或处理 I/O 操作,这些操作可能会导致主线程阻塞,从而降低用户体验。C# 提供了多线程与异步编程的多种工具,让我们能够高效地并发处理任务。本文将介绍 C# 中的多线程与异步编程,包括 Thread 类…...
Angular 2 用户输入
Angular 2 用户输入 Angular 2 是一个由 Google 维护的开源前端 web 框架,用于构建单页应用程序(SPA)。它以其高效的双向数据绑定、模块化架构和强大的依赖注入系统而闻名。在 Angular 2 应用程序中,处理用户输入是核心功能之一,因为它允许应用程序响应用户的操作。 Ang…...
线程安全的单例模式 | 可重入 | 线程安全 |死锁(理论)
🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…...
解决方案:梯度提升树(Gradient Boosting Trees)跟GBDT(Gradient Boosting Decision Trees)有什么区别
文章目录 一、现象二、解决方案梯度提升树(GBT)GBDT相同点区别 一、现象 在工作中,在机器学习中,时而会听到梯度提升树(Gradient Boosting Trees)跟GBDT(Gradient Boosting Decision Trees&…...
亚马逊国际商品详情API返回值:电商精准营销的关键
亚马逊国际商品详情API(Amazon Product Advertising API)为开发者提供了一种获取商品信息的方式,这些信息对于电商精准营销至关重要。通过分析API返回的详细数据,商家可以制定更精准的营销策略,提高用户购买转化率。 …...
python爬虫 - 进阶requests模块
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 (一)跳过 SSL 证书验证 ࿰…...
代码随想录 103. 水流问题
103. 水流问题 #include<bits/stdc.h> using namespace std;void dfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){if (visit[y][x] 1) return;visit[y][x] 1;if (y > 0){if (mp[y][x] < mp[y - 1][x…...
数据结构-排序1
1.排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序…...
Springboot 整合 durid
文章目录 Springboot 整合 druiddruid的优势配置参数使用整合 Druid配置数据源配置参数绑定配置参数配置监控页面配置拦截器 Springboot 整合 druid druid的优势 可以很好的监控 DB 池连接 和 SQL 的执行情况可以给数据库密码加密可以很方便的编写JDBC插件 配置参数 使用 整…...
JVM 系列知识体系全面回顾
经过几个月的努力,JVM 知识体系终于梳理完成了。 很早之前也和小伙伴们分享过 JVM 相关的技术知识,再次感谢大家支持和反馈。 最后再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以点击查看。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的…...
crossover软件如何安装程序 及最新图文案张教程
IT之家 2 月 23 日消息,CodeWeavers 近日发布了 CrossOver 24 版本更新,基于近期发布的 Wine 9.0,不仅兼容更多应用和游戏,还初步支持运行 32 位应用程序。 苹果在 macOS Catalina 系统中移除对 32 位软件的支持之后,在…...
Python爬虫之正则表达式于xpath的使用教学及案例
正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符(数字、字母、下划线) \W # 匹配任意一个非单词字符 . # 匹配任意一个字符(除了换行符) [a-z] # 匹配任意一个小写字母 […...
Jenkins打包,发布,部署
一、概念 Jenkins是一个开源的持续集成工具,主要用于自动构建和测试软件项目,以及监控外部任务的运行。与版本管理工具(如SVN,GIT)和构建工具(如Maven,Ant,Gradle)结合使…...
CSS 实现楼梯与小球动画
CSS 实现楼梯与小球动画 效果展示 CSS 知识点 CSS动画使用transform属性使用 页面整体布局 <div class"window"><div class"stair"><span style"--i: 1"></span><span style"--i: 2"></span>…...
sqli-labs less-14post报错注入updatexml
post提交报错注入 闭合方式及注入点 利用hackbar进行注入,构造post语句 unameaaa"passwdbbb&SubmitSubmit 页面报错,根据分析,闭合方式". 确定列数 构造 unameaaa" or 11 # &passwdbbb&SubmitSubmit 确定存在注…...
Python开发环境配置(mac M2)
1. 前言 作为一名程序员,工作中需要使用Python进行编程,甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python,如何给Pycharm(IDE)配置对应的interpreter等,都成为一个 “不熟练工” 的难…...
其他:Python语言绘图合集
文章目录 介绍注意导入数据函数模块画图 介绍 python语言的科研绘图合集 注意 This dataset includes the following (All files are preceded by "Marle_et_al_Nature_AirborneFraction_"):- "Datasheet.xlsx": Excel dataset containing all annual a…...
处理 Vue3 中隐藏元素刷新闪烁问题
一、问题说明 页面刷新,原本隐藏的元素会一闪而过。 效果展示: 页面的导航栏通过路由跳转中携带的 meta 参数控制导航栏的 显示/隐藏,但在实践过程中发现,虽然元素隐藏了,但是刷新页面会出现闪烁的问题。 项目源码&…...
【MySQL】数据目录迁移
一、使用场景 使用该方法一般是数据目录所在磁盘不支持扩展,只能通过新加磁盘来扩展数据目录磁盘空间。通常是Windows服务器,或者是Linux服务器的mysql数据目录的磁盘没有使用lvm。 二、准备工作 1. 新磁盘初始化,达到可使用状态 2. 需要自己…...
【项目安全设计】软件系统安全设计规范和标准(doc原件)
1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取:私信或者进主页。…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
