掌握 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终端安全保障 资料获取:私信或者进主页。…...
从 AI 工具到音乐生态:可酷加速布局,构建数字音乐全新基础设施
当数字音乐行业从流量竞争迈入生态竞争的新阶段,单一产品的功能边界已难以支撑企业长期增长,完善的生态协同能力逐渐成为企业突围的核心竞争力,也成为定义行业未来格局的关键变量。在此背景下,可酷公司近日对外披露其全新发展战略…...
从零训练潮州话语音克隆模型:ElevenLabs Fine-tuning实战(附1782条标注语料清洗脚本)
更多请点击: https://codechina.net 第一章:从零训练潮州话语音克隆模型:ElevenLabs Fine-tuning实战(附1782条标注语料清洗脚本) 语料准备与质量校验 潮州话语音克隆对数据一致性要求极高。我们采集并人工标注了178…...
使用Taotoken后API调用稳定性与延迟的实际体验观察
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后API调用稳定性与延迟的实际体验观察 在最近一个为期一周的后端服务开发项目中,我们将原本直接调用多个厂…...
保姆级教程:在K8s集群上部署Triton Inference Server服务(含TensorRT加速配置)
生产级K8s集群部署Triton Inference Server全流程指南 在AI模型工业化落地的浪潮中,如何将训练好的模型高效、稳定地部署到生产环境,成为众多技术团队面临的共同挑战。本文将聚焦Kubernetes集群环境,详细拆解NVIDIA Triton Inference Server…...
Redis 主从复制与哨兵机制详解:从原理到高可用实战
Redis 主从复制与哨兵机制详解:从原理到高可用实战 1. 引言 Redis 作为高性能的键值存储系统,在生产环境中常面临两大挑战:单点故障(一个节点宕机导致服务不可用)和读写压力(单节点无法承载高并发读请求&am…...
jor1k性能优化技巧:如何显著提升浏览器中Linux的运行速度
jor1k性能优化技巧:如何显著提升浏览器中Linux的运行速度 【免费下载链接】jor1k Online OR1K Emulator running Linux 项目地址: https://gitcode.com/gh_mirrors/jo/jor1k jor1k是一款能够在浏览器中运行Linux的在线OR1K模拟器,让用户无需本地安…...
终极指南:在Debian/Ubuntu系统上快速配置DisplayLink多屏扩展驱动
终极指南:在Debian/Ubuntu系统上快速配置DisplayLink多屏扩展驱动 【免费下载链接】displaylink-debian DisplayLink driver installer for Debian and Ubuntu based Linux distributions. 项目地址: https://gitcode.com/gh_mirrors/di/displaylink-debian …...
DistroAV(原OBS-NDI)完整使用指南:NDI技术在OBS中的高效应用
DistroAV(原OBS-NDI)完整使用指南:NDI技术在OBS中的高效应用 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV(原名…...
拆解昇腾 CANN 五层架构:一个 MatMul 请求的完整旅程
适合人群:想从全局视角理解 CANN 架构的开发者 核心仓库:https://atomgit.com/cann 阅读时长:6 分钟 目录 一、为什么需要五层架构?二、第1层:昇腾计算语言层 AscendCL三、第2层:昇腾计算服务层四、第3层&…...
VBA添加超链接:Hyperlinks.Add 方法 完整参数解析
Worksheet.Hyperlinks.Add Cells(j 1, 11), ar(2, j), "", "单击打开:" & ar(1, j), ar(1, j) 每个参数解析、 VBA Hyperlinks.Add 方法 完整参数解析 你这句代码是Excel VBA 给单元格添加超链接的核心语句,我把 Hyperlinks.…...
