一文吃透 C#中异步编程Task
一文吃透 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.Run
Task<int> runTask = Task