.NET修仙传
修炼秘籍
.net 修炼路线图
书籍大全
C#入门后该如何进阶?如何提升自己?
读写 Excel 四种方案
书籍大全
dotnet命令大全
C# 程序集加载方法
linux 下部署.net环境
.NET WebAPI中FromRoute、FromQuery、FromBody的关键角色与用法
C# 新用法
盘点C#最有价值的10个语法糖
C#基础语法与数据类型
序列化
C# 7.0
模式匹配Pattern Matching
优秀实用的类库推荐
2024年C#优秀实用的类库推荐
依赖注入与中间件
依赖注入
查询所有已注入的服务
WebApi实现批量注入
原生依赖注入
自动依赖注入框架
优秀中间件
依赖注入
Autofac
生命周期
文档操作
PDF操作
PDF合并及生成书签目录
Excel操作
几个Excel文件合并去重分类
Excel文件之COM组件方式
操作Excel文件之NPOI
INI文件
面试宝典
WebService、WCF、WebAPI、一般处理程序
C# 线程和进程的区别
asp.net core 服务生命周期
asp.net core 的中间件都有哪些
操作系统编程
获取搜狗输入法中英文
com组件集成
执行系统命令
通过句柄嵌入exe窗体程序
windows-开机自启动
程序调用cmd命令生成WCF服务的客户端调用文件
获取电脑信息
键盘记录器
键盘改键功能
监听鼠标操作
框架揭秘
01编程初体验
中间件 Middleware
路由
配置管理
配置系统
配置管理
日志管理
Log4Net
NLog
.net core原始日志记录
日志管理
Serilog
LINQ
LINQ概讲
LINQ编程
常用方法
ORM
EF Core初始化
EF Core的实体类配置
执行原生SQL语句
EF Core
操作sqlite
操作Mysql数据库
操作LiteDB
AutoMapper高效实现对象映射
AutoMapper
AutoMapper 10个常用方法总结
缓存
Redis支持哪几种数据类型?
什么是Redis?简述它的优缺点?
Redis相比memcached有哪些优势?
认证
什么是 JWT?它是如何工作的?
.net framework jwt
.net core Jwt操作
认证管理
.Net WebApi校验Token/参数的几种方式
鉴权授权
Authorization的几种方式
基础语法
集合
1、C#中常用集合类型
yield return 简化迭代并提高代码质量
AOP
.net core AOP
操作筛选器
网络编程
TCP 连接的前世今生
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
网络编程
WebApi获取客户信息
通信
HTTP通信
公共类-HttpHelper
多线程编程
十种线程方式分析
Task-筑基期
parallel-筑基
消息队列
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
构建高性能 API 的高级技术
优秀教程网站
每日学习地址
全套教程汇总
理解ASP.NET Core
定时任务
定时器的三种使用方式
定时任务之windows任务计划程序
创建任务到Windows任务计划程序
定时任务之Quartz.Net
IHostedService启动时运行定时任务
JSON序列化反序列化工具
前辈
发布部署
应用部署
GRPC
使用GRPC多个proto文件
本文档使用 MrDoc 发布
-
+
首页
十种线程方式分析
C#提供了多种开启线程的方式,每种方式都有其独特的使用场景、优点和缺点。以下是C#中十种常见的开启线程的方式,以及它们各自的使用场景、优点和缺点: # 1. Thread类 | 表述 | 内容 | | --- | --- | | 使用场景: | 快速启动执行简单任务。 | | 优点: |简单易用。提供了直接控制线程的方法,如Start、Suspend、Resume、Abort等。 | |缺点: | 功能较少,不适合复杂的线程管理;直接管理线程可能导致资源利用率不高或死锁等问题。 | ```java Thread thread = new Thread(() => Console.WriteLine("Hello from a new thread!")); thread.Start(); ``` # 2. Task并行库 | 表述 | 内容 | | --- | --- | | 使用场景: | 需要更好的错误处理和任务管理。 | | 优点: | 提供了丰富的API,如Task.Run、Task.WhenAll、Task.WhenAny等,易于集成和使用;支持更复杂的并发模式,如取消、超时和错误处理。 | | 缺点: | 学习曲线较陡峭,需要掌握异步编程的概念。 | ```java Task.Run(() => Console.WriteLine("Task-based asynchronicity!")); ``` # 3. BackgroundWorker组件 | 表述 | 内容 | | --- | --- | | 使用场景: | GUI应用中需要在后台执行任务,同时需要报告进度或处理异常。 | | 优点: | 支持进度更新和取消操作;自动将工作线程上的异常封送到UI线程,便于处理。 | | 缺点: | 较老的技术,可能在未来的.NET版本中逐渐淘汰;功能相对有限,不如Task并行库灵活。 | ```java var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += (sender, e) => Console.WriteLine("BackgroundWorker in action!"); backgroundWorker.RunWorkerAsync(); ``` # 4. ThreadPool | 表述 | 内容 | | --- | --- | | 使用场景: | 需要高效利用线程池资源,执行大量短时间的任务。 | | 优点: | 减少了线程创建和销毁的开销;提高了系统的响应性和吞吐量。 | | 缺点: |控制度较低,不适合长时间运行的任务;可能因为线程池资源耗尽而导致任务等待。 | ```java ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Utilizing the thread pool!")); ``` # 5. Timer类 | 表述 | 内容 | | --- | --- | | 使用场景: | 需要周期性执行任务。 | | 优点: | 简单实现周期性任务;可以在指定的时间间隔后执行回调方法。 | | 缺点: | 精度受限于系统计时器;长时间运行可能会导致资源消耗过多。 | ```java var timer = new Timer( state => Console.WriteLine("Timer ticks!"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)); ``` # 6. async和await | 表述 | 内容 | | --- | --- | | 使用场景: | 需要简化异步代码,提高代码的可读性和可维护性。 | | 优点: | 代码更易读易维护;简化了异步编程的复杂性。 | | 缺点: | 需要.NET 4.5或更高版本;可能会导致死锁,特别是在GUI应用中。 | ```java async Task DoAsyncWork() { await Task.Run(() => Console.WriteLine("Async/Await in action!")); } ``` # 7. Parallel类 | 表述 | 内容 | | --- | --- | | 使用场景: | 需要对数据集合进行并行处理,以提高性能。 | | 优点: | 简化了并行代码编写。提供了丰富的并行操作API,如Parallel.For、Parallel.ForEach、Parallel.Sum等。 | | 缺点: | 可能增加线程管理开销;需要考虑数据划分和合并的问题。 | ```java int[] numbers = { 1, 2, 3, 4 }; int sum = Parallel.Sum(numbers); ``` # 8. ThreadLocal | 表述 | 内容 | | --- | --- | | 使用场景: | 需要线程安全的局部数据存储。 | | 优点:| 线程安全,避免数据竞争;提供了独立的数据副本给每个线程。 | | 缺点: | 管理不当可能导致资源泄露;需要手动清理不再需要的数据副本。 | ```java ThreadLocal<int> localValue = new ThreadLocal<int>(() => 0); localValue.Value++; // Each thread increments its own copy ``` # 9. Lazy | 表述 | 内容 | | --- | --- | | 使用场景: | 需要延迟初始化对象,以节省资源或处理耗时的初始化任务。 | | 优点: | 延迟初始化,节省资源;提高了应用的启动速度。 | | 缺点: | 首次访问时可能引入延迟;需要考虑线程安全问题(尽管Lazy<T>本身是线程安全的)。 | ```java Lazy<int> lazyValue = new Lazy<int>(() => { Thread.Sleep(1000); // Simulate long initialization. return 42; }); ``` # 10. PLINQ | 表述 | 内容 | | --- | --- | | 使用场景:| 对大数据集进行LINQ查询,并希望利用多核处理器提高查询效率。 | | 优点: | 利用多核处理器提高查询效率;简化了并行查询的编写。 | | 缺点: | 并行执行可能增加线程管理开销;需要考虑数据分区和聚合的策略。 | ```java var numbers = Enumerable.Range(0, 10000).AsParallel().Where(x => x % 2 == 0).ToList(); ``` # 总结 C#提供了多种开启线程的方式,每种方式都有其特定的使用场景和优缺点。开发者在选择时应根据实际需求、性能要求和可维护性等因素进行综合考虑。
孙端己
2024年7月23日 15:04
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码