一文吃透 C#中异步编程Task

发布于:2025-09-06 ⋅ 阅读:(12) ⋅ 点赞:(0)


一文吃透 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

网站公告

今日签到

点亮在社区的每一天
去签到