当前位置: 首页 > news >正文

掌握 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 操作&#xff0c;这些操作可能会导致主线程阻塞&#xff0c;从而降低用户体验。C# 提供了多线程与异步编程的多种工具&#xff0c;让我们能够高效地并发处理任务。本文将介绍 C# 中的多线程与异步编程&#xff0c;包括 Thread 类…...

Angular 2 用户输入

Angular 2 用户输入 Angular 2 是一个由 Google 维护的开源前端 web 框架,用于构建单页应用程序(SPA)。它以其高效的双向数据绑定、模块化架构和强大的依赖注入系统而闻名。在 Angular 2 应用程序中,处理用户输入是核心功能之一,因为它允许应用程序响应用户的操作。 Ang…...

线程安全的单例模式 | 可重入 | 线程安全 |死锁(理论)

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…...

解决方案:梯度提升树(Gradient Boosting Trees)跟GBDT(Gradient Boosting Decision Trees)有什么区别

文章目录 一、现象二、解决方案梯度提升树&#xff08;GBT&#xff09;GBDT相同点区别 一、现象 在工作中&#xff0c;在机器学习中&#xff0c;时而会听到梯度提升树&#xff08;Gradient Boosting Trees&#xff09;跟GBDT&#xff08;Gradient Boosting Decision Trees&…...

亚马逊国际商品详情API返回值:电商精准营销的关键

亚马逊国际商品详情API&#xff08;Amazon Product Advertising API&#xff09;为开发者提供了一种获取商品信息的方式&#xff0c;这些信息对于电商精准营销至关重要。通过分析API返回的详细数据&#xff0c;商家可以制定更精准的营销策略&#xff0c;提高用户购买转化率。 …...

python爬虫 - 进阶requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 &#xff08;一&#xff09;跳过 SSL 证书验证 &#xff0…...

代码随想录 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.排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序…...

Springboot 整合 durid

文章目录 Springboot 整合 druiddruid的优势配置参数使用整合 Druid配置数据源配置参数绑定配置参数配置监控页面配置拦截器 Springboot 整合 druid druid的优势 可以很好的监控 DB 池连接 和 SQL 的执行情况可以给数据库密码加密可以很方便的编写JDBC插件 配置参数 使用 整…...

JVM 系列知识体系全面回顾

经过几个月的努力&#xff0c;JVM 知识体系终于梳理完成了。 很早之前也和小伙伴们分享过 JVM 相关的技术知识&#xff0c;再次感谢大家支持和反馈。 最后再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以点击查看。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的…...

crossover软件如何安装程序 及最新图文案张教程

IT之家 2 月 23 日消息&#xff0c;CodeWeavers 近日发布了 CrossOver 24 版本更新&#xff0c;基于近期发布的 Wine 9.0&#xff0c;不仅兼容更多应用和游戏&#xff0c;还初步支持运行 32 位应用程序。 苹果在 macOS Catalina 系统中移除对 32 位软件的支持之后&#xff0c;在…...

Python爬虫之正则表达式于xpath的使用教学及案例

正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符&#xff08;数字、字母、下划线&#xff09; \W # 匹配任意一个非单词字符 . # 匹配任意一个字符&#xff08;除了换行符&#xff09; [a-z] # 匹配任意一个小写字母 […...

Jenkins打包,发布,部署

一、概念 Jenkins是一个开源的持续集成工具&#xff0c;主要用于自动构建和测试软件项目&#xff0c;以及监控外部任务的运行。与版本管理工具&#xff08;如SVN&#xff0c;GIT&#xff09;和构建工具&#xff08;如Maven&#xff0c;Ant&#xff0c;Gradle&#xff09;结合使…...

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进行注入&#xff0c;构造post语句 unameaaa"passwdbbb&SubmitSubmit 页面报错&#xff0c;根据分析&#xff0c;闭合方式". 确定列数 构造 unameaaa" or 11 # &passwdbbb&SubmitSubmit 确定存在注…...

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…...

其他: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 中隐藏元素刷新闪烁问题

一、问题说明 页面刷新&#xff0c;原本隐藏的元素会一闪而过。 效果展示&#xff1a; 页面的导航栏通过路由跳转中携带的 meta 参数控制导航栏的 显示/隐藏&#xff0c;但在实践过程中发现&#xff0c;虽然元素隐藏了&#xff0c;但是刷新页面会出现闪烁的问题。 项目源码&…...

【MySQL】数据目录迁移

一、使用场景 使用该方法一般是数据目录所在磁盘不支持扩展&#xff0c;只能通过新加磁盘来扩展数据目录磁盘空间。通常是Windows服务器&#xff0c;或者是Linux服务器的mysql数据目录的磁盘没有使用lvm。 二、准备工作 1. 新磁盘初始化&#xff0c;达到可使用状态 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终端安全保障 资料获取&#xff1a;私信或者进主页。…...

从 AI 工具到音乐生态:可酷加速布局,构建数字音乐全新基础设施

当数字音乐行业从流量竞争迈入生态竞争的新阶段&#xff0c;单一产品的功能边界已难以支撑企业长期增长&#xff0c;完善的生态协同能力逐渐成为企业突围的核心竞争力&#xff0c;也成为定义行业未来格局的关键变量。在此背景下&#xff0c;可酷公司近日对外披露其全新发展战略…...

从零训练潮州话语音克隆模型:ElevenLabs Fine-tuning实战(附1782条标注语料清洗脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;从零训练潮州话语音克隆模型&#xff1a;ElevenLabs Fine-tuning实战&#xff08;附1782条标注语料清洗脚本&#xff09; 语料准备与质量校验 潮州话语音克隆对数据一致性要求极高。我们采集并人工标注了178…...

使用Taotoken后API调用稳定性与延迟的实际体验观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后API调用稳定性与延迟的实际体验观察 在最近一个为期一周的后端服务开发项目中&#xff0c;我们将原本直接调用多个厂…...

保姆级教程:在K8s集群上部署Triton Inference Server服务(含TensorRT加速配置)

生产级K8s集群部署Triton Inference Server全流程指南 在AI模型工业化落地的浪潮中&#xff0c;如何将训练好的模型高效、稳定地部署到生产环境&#xff0c;成为众多技术团队面临的共同挑战。本文将聚焦Kubernetes集群环境&#xff0c;详细拆解NVIDIA Triton Inference Server…...

Redis 主从复制与哨兵机制详解:从原理到高可用实战

Redis 主从复制与哨兵机制详解&#xff1a;从原理到高可用实战 1. 引言 Redis 作为高性能的键值存储系统&#xff0c;在生产环境中常面临两大挑战&#xff1a;单点故障&#xff08;一个节点宕机导致服务不可用&#xff09;和读写压力&#xff08;单节点无法承载高并发读请求&am…...

jor1k性能优化技巧:如何显著提升浏览器中Linux的运行速度

jor1k性能优化技巧&#xff1a;如何显著提升浏览器中Linux的运行速度 【免费下载链接】jor1k Online OR1K Emulator running Linux 项目地址: https://gitcode.com/gh_mirrors/jo/jor1k jor1k是一款能够在浏览器中运行Linux的在线OR1K模拟器&#xff0c;让用户无需本地安…...

终极指南:在Debian/Ubuntu系统上快速配置DisplayLink多屏扩展驱动

终极指南&#xff1a;在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&#xff08;原OBS-NDI&#xff09;完整使用指南&#xff1a;NDI技术在OBS中的高效应用 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV&#xff08;原名…...

拆解昇腾 CANN 五层架构:一个 MatMul 请求的完整旅程

适合人群&#xff1a;想从全局视角理解 CANN 架构的开发者 核心仓库&#xff1a;https://atomgit.com/cann 阅读时长&#xff1a;6 分钟 目录 一、为什么需要五层架构&#xff1f;二、第1层&#xff1a;昇腾计算语言层 AscendCL三、第2层&#xff1a;昇腾计算服务层四、第3层&…...

VBA添加超链接:Hyperlinks.Add 方法 完整参数解析

Worksheet.Hyperlinks.Add Cells(j 1, 11), ar(2, j), "", "单击打开&#xff1a;" & ar(1, j), ar(1, j) 每个参数解析、 VBA Hyperlinks.Add 方法 完整参数解析 你这句代码是Excel VBA 给单元格添加超链接的核心语句&#xff0c;我把 Hyperlinks.…...