一文吃透 C#中异步编程Task
- 一、Task 是什么
- 二、推荐使用场景
- 三、Demo:Task 的核心用法
-
- 1. 最常用的启动方式Task.Run
- 2. task完成状态与结果获取
- 3. 多个任务怎么等?Wait/WaitAll/WaitAny
- 4. 任务想中途停掉?取消与异常处理
- 四、必备 API 速查表
- 五、避坑指南、注意事项
- 总结
一文吃透 C#中异步编程Task
一、Task 是什么
Task 是 C# 中用于处理异步操作的类,从.NET Framework 4 开始引入。它不像 Thread 需要手动管理线程生命周期,而是基于线程池自动调度,轻量又好控制。Task的关键特点:
- 异步执行:在后台线程执行,不阻塞主线程
- 状态可控制:能随时知道任务是 “正在跑”、“已完成” 还是 “被取消”
- 支持返回值:能返回操作结果,方便后续使用
二、推荐使用场景
Task 虽好,但并非所有场景都适用。以下场景适合发挥它的优势:
- 复杂计算:如图像处理、数据分析这类耗时操作,放到 Task 里在后台执行,不影响用户操作界面
- 多任务并行:同时执行多个独立任务,像同时下载多个文件,每个下载任务用一个 Task,提高整体效率
- 后台任务:如定期清理缓存、日志记录等后台操作,适合用 Task 在后台默默执行
三、Demo:Task 的核心用法
1. 最常用的启动方式Task.Run
- 不用手动创建线程,Task 会自动从线程池拿资源(线程池无空闲线程时会自动创建)
- 适合大多数简单异步场景,推荐优先使用
static void BasicTaskDemo()
{// 用Task.Run启动一个任务,自动在后台执行Task.Run(() => {Thread.Sleep(500); // 模拟耗时操作Console.WriteLine($"BasicTaskDemo Task End,线程ID: {Thread.CurrentThread.ManagedThreadId}"); }); // Task<int> task = Task.Run(() => 100 + 200); /返回值
}
2. task完成状态与结果获取
- 结果已知或同步可得,优先用 FromResult 包装为 Task,避免不必要的线程调度和等待
- 若需异步计算,使用 Task.Run 或其他异步方式,Result会阻塞当前线程
static string Now() => DateTime.Now.ToString("HH:mm:ss.fff");
static void FromResultDemo()
{// 场景1:Task.FromResult:创建已完成的任务,立即可用,仅仅是把已知结果包装为Task(不耗时)Task<int> fromResultTask = Task.FromResult(123); Console.WriteLine($"{Now()} fromResultTask 已完成: IsCompleted={fromResultTask.IsCompleted}, Result={fromResultTask.Result}"); // 场景2:需要异步计算,用Task.RunTask<int> runTask = Task