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

System.Threading.Tasks 库简介

System.Threading.Tasks 是 .NET 中任务并行库(Task Parallel Library, TPL)的核心组件,它提供了基于任务的异步编程模型,是现代 .NET 并发编程的基础。

设计原理

1. 核心目标

  • 抽象并发工作:将并发操作抽象为"任务"概念

  • 资源高效利用:自动管理线程池资源

  • 组合性:支持任务链式操作和组合

  • 取消支持:内置取消操作机制

  • 状态跟踪:提供任务生命周期管理

2. 关键组件

  • Task/Task<T>:表示异步操作的核心类

  • TaskScheduler:控制任务如何、何时被执行

  • TaskFactory:提供创建和启动任务的便捷方法

  • CancellationToken:任务取消机制

  • TaskCompletionSource:手动控制任务生命周期

3. 架构层次

  1. 用户层:开发者直接使用的Task API

  2. 调度层:TaskScheduler管理任务执行

  3. 线程池层:实际执行工作的底层线程池

典型用法示例

示例1:基础异步任务

// 创建并运行简单任务
Task.Run(() => 
{Console.WriteLine("任务在后台线程执行");Thread.Sleep(1000); // 模拟工作Console.WriteLine("任务完成");
});// 带返回值的任务
Task<int> calculateTask = Task.Run(() => 
{Thread.Sleep(500);return 42; // 计算结果
});// 等待任务完成并获取结果
int result = await calculateTask;
Console.WriteLine($"计算结果: {result}");

应用场景:CPU密集型后台计算,不阻塞UI线程。

示例2:任务组合与延续

// 创建三个任务
Task<string> task1 = Task.Run(() => "Hello");
Task<string> task2 = Task.Run(() => "World");
Task<int> task3 = Task.Run(() => 2023);// 等待所有任务完成
await Task.WhenAll(task1, task2, task3);// 使用结果组合输出
Console.WriteLine($"{task1.Result} {task2.Result} {task3.Result}");// 任务延续
Task continuation = task1.ContinueWith(t => 
{Console.WriteLine($"前一个任务的结果: {t.Result}");
}, TaskContinuationOptions.OnlyOnRanToCompletion);

应用场景:并行执行多个独立操作,然后合并结果或执行后续操作。

示例3:高级任务控制

// 使用TaskCompletionSource手动控制任务
var tcs = new TaskCompletionSource<string>();// 模拟异步回调
Timer timer = new Timer(_ => 
{try{// 模拟工作string result = DateTime.Now.ToString();tcs.SetResult(result); // 手动完成任务}catch (Exception ex){tcs.SetException(ex); // 手动设置异常}
}, null, 1000, Timeout.Infinite);// 等待任务完成
try
{string timeString = await tcs.Task;Console.WriteLine($"当前时间: {timeString}");
}
catch (Exception ex)
{Console.WriteLine($"任务失败: {ex.Message}");
}

应用场景:将基于回调的异步API转换为基于任务的异步模式(TAP)。

示例4:取消任务

var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;// 创建可取消的任务
Task longRunningTask = Task.Run(() => 
{for (int i = 0; i < 100; i++){token.ThrowIfCancellationRequested(); // 检查取消请求Thread.Sleep(100); // 模拟工作Console.WriteLine($"进度: {i}%");}
}, token);// 3秒后取消任务
cts.CancelAfter(3000);try
{await longRunningTask;
}
catch (OperationCanceledException)
{Console.WriteLine("任务被取消");
}

应用场景:长时间运行的操作需要提供取消功能。

核心概念深入

1. 任务状态机

任务有以下几种状态:

  • Created:已创建但未调度

  • WaitingForActivation:等待激活

  • WaitingToRun:已调度但未开始执行

  • Running:正在执行

  • WaitingForChildrenToComplete:等待子任务完成

  • RanToCompletion:成功完成

  • Canceled:被取消

  • Faulted:因异常失败

2. 任务调度策略

  • 线程池调度器:默认调度器,使用线程池线程

  • 同步上下文调度器:在特定同步上下文(如UI线程)执行

  • 自定义调度器:可继承TaskScheduler实现特殊调度逻辑

3. 异常处理

任务中的异常会被捕获并存储在 Task.Exception 属性中,当等待任务或访问Result属性时,这些异常会被重新抛出。

Task faultyTask = Task.Run(() => throw new InvalidOperationException("出错了"));try
{await faultyTask;
}
catch (InvalidOperationException ex)
{Console.WriteLine($"捕获到异常: {ex.Message}");
}

最佳实践

  1. 避免Task.Wait和Task.Result:可能导致死锁,优先使用await

  2. 合理使用ConfigureAwait:库代码应使用ConfigureAwait(false)

  3. 注意任务生命周期:长时间运行的任务应考虑取消支持

  4. 避免过度并行化:太多并行任务会导致线程池饥饿

  5. 正确处理异常:确保所有任务异常都被处理

性能考虑

  • 任务创建开销:轻量级但非零成本,高频场景考虑对象池

  • 线程池压力:大量短任务可能导致线程池频繁调整

  • 同步上下文:不必要地回到原始上下文会影响性能

System.Threading.Tasks 提供了强大而灵活的并发编程模型,是现代 .NET 应用程序中处理异步和并行操作的首选方式。

http://www.lryc.cn/news/576032.html

相关文章:

  • Vulkan模型查看器设计:相机类与三维变换
  • Java底层原理:深入理解JVM内存模型与线程安全
  • Node.js到底是什么
  • Jmeter并发测试和持续性压测
  • IBW 2025: CertiK首席商务官出席,探讨AI与Web3融合带来的安全挑战
  • 记录一次飞书文档转md嵌入vitepress做静态站点
  • 时序数据库全面解析与对比
  • 基础RAG实现,最佳入门选择(十二)
  • mysql表操作与查询
  • RJ45 以太网与 5G 的原理解析及区别
  • 成都芯谷金融中心·文化科技产业园:绘就区域腾飞新篇章
  • 如何在安卓设备上发送长视频:6 种可行的解决方案
  • day49-硬件学习之I2C(续)
  • 数据结构之顺序表(C语言版本)
  • MongoDB 和 Redis的区别
  • Tomcat Maven 插件
  • iOS 远程调试与离线排查实战:构建非现场问题复现机制
  • K8s port、targetPort和nodePort区别
  • GitHub Actions与AWS OIDC实现安全的ECR/ECS自动化部署
  • TCP/IP协议简要概述
  • 国产鸿蒙系统开放应用侧载,能威胁到Windows地位吗?
  • 工作台-01.需求分析与设计
  • qq邮箱 新版 怎么去掉个性签名?
  • Java 大视界 -- Java 大数据在智能教育学习社群知识共享与协同学习促进中的应用(326)
  • 参考nlohmann json设计Cereal宏 一行声明序列化函数
  • vscode把less文件生成css文件配置,设置生成自定义文件名称和路径
  • ​​Git提交代码Commit消息企业级规范
  • 自动驾驶nuPlan数据集-入门使用和可视化操作
  • 【NodeJs】【npm】npm安装electron报错
  • 智能体记忆原理-prompt设计