C#Task(Api)应用

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

目录

1.线程创建和启动

2.任务等待与组合

3.任务延续

4.任务取消

5.任务状态与信息

6.任务延时


1.线程创建和启动

1. Task.Run(Action) / Task.Run<TResult>(Func<TResult>)

  • 功能:在线程池上启动一个任务(最常用的创建方式)
  • 特点:自动调度到线程池,返回可等待的 Task 或 Task<TResult>
  • // 无返回值任务
    Task task = Task.Run(() => Console.WriteLine("任务执行中"));
    
    // 带返回值任务
    Task<int> resultTask = Task.Run(() => 1 + 2);
    int result = await resultTask; // 结果为 3

2.new Task(Action) / Task.Start()

  • 功能:显式创建任务后手动启动
  • 特点:需调用 Start() 才会执行,可指定调度器
    Task task = new Task(() => Console.WriteLine("手动启动的任务"));
    task.Start(); // 启动任务
    await task;

3.Task.Factory.StartNew(Action)

  • 功能:通过工厂方法创建并启动任务
  • 特点:支持更多创建选项(如任务优先级、是否长时间运行)
    // 创建长时间运行的任务(可能会创建新线程而非使用线程池)
    Task longTask = Task.Factory.StartNew(
        () => { /* 长时间运行的操作 */ },
        TaskCreationOptions.LongRunning
    );

2.任务等待与组合

1.Task.Wait() / Task.Wait(int millisecondsTimeout)

  • 功能:同步等待任务完成(阻塞当前线程)
  • 参数:可选超时时间(毫秒)
  • Task task = Task.Run(() => Task.Delay(2000));//Delayh创建将在时间结束后完成的任务
    bool completed = task.Wait(1000); // 等待1秒,返回是否完成
    //也可以之际wait()
    task.wait();//等待线程执行完毕

2.awat关键字

  • 功能:异步等待任务完成(不阻塞当前线程)
  • 特点:必须在 async 方法中使用
     static async Task Main(string[] args)
     {
       await Test();
     }
     public static async Task Test()
     {
         Task task = Task.Run(() => { while (true) { Thread.Sleep(1000); Console.WriteLine("-----------"); } });
         await Task.Delay(5000);//5s过后默认task执行完毕
         Console.WriteLine("'''''''''''''''''''''''''");
         // 等待1秒,返回是否完成
     }

3.Task.WhenAll(Task[])

  • 功能:等待所有任务完成后再继续
  • 返回值:一个新任务,完成时包含所有任务的结果(如果是 Task<TResult>
  • Task task1 = Task.Run(() => Task.Delay(1000));
    Task task2 = Task.Run(() => Task.Delay(2000));
    await Task.WhenAll(task1, task2); // 等待两个任务都完成

4.Task.WhenAny(Task[])

  • 功能:等待任一任务完成后就继续
  • 返回值:第一个完成的任务
  • Task taskA = Task.Run(() => Task.Delay(1000));
    Task taskB = Task.Run(() => Task.Delay(1500));
    Task completedTask = await Task.WhenAny(taskA, taskB); // taskA 先完成

3.任务延续

1.Task.ContinueWith(Action<Task>)

  • 功能:当前任务完成后自动执行延续操作
  • 特点:可访问前序任务的状态和结果
  • Task<int> calcTask = Task.Run(() => 10 * 2);
    calcTask.ContinueWith(prevTask => 
    {
        Console.WriteLine($"前序任务结果:{prevTask.Result}"); // 输出 20
    }).Wait();

2.延续选项(TaskContinuationOptions

  • 功能:控制延续任务的执行条件(如仅在前序任务成功 / 失败时执行)

  • Task task = Task.Run(() => 
    {
        throw new Exception("任务失败");
    });
    
    // 仅当前序任务失败时执行
    task.ContinueWith(prev => 
    {
        Console.WriteLine($"捕获异常:{prev.Exception.Message}");
    }, TaskContinuationOptions.OnlyOnFaulted);

4.任务取消

1.CancellationTokenSource / CancellationToken

  • 功能:优雅地请求取消任务

  • 流程:创建令牌源 → 传递令牌到任务 → 调用 Cancel() 请求取消

static async Task Main(string[] args)
        {
            CancellationTokenSource cst = new CancellationTokenSource();
            await Test(cst.Token);
            
        }
        public static async Task Test(CancellationToken token)
        {
            Task task = Task.Run(() => { while (true) { Thread.Sleep(1000); Console.WriteLine("-----------"); } });
            await Task.Delay(5000, token);//5s过后默认task执行完毕,关闭线程
            Console.WriteLine("'''''''''''''''''''''''''");
            
        }

5.任务状态与信息

1.Task.Status

  • 功能:获取任务当前状态(枚举 TaskStatus

  • 常见状态Created(已创建)、Running(运行中)、RanToCompletion(完成)、Canceled(已取消)、Faulted(出错)

    Task task = Task.Run(() => Task.Delay(1000));
    Console.WriteLine(task.Status); // 输出 Running
    await task;
    Console.WriteLine(task.Status); // 输出 RanToCompletion

2.Task.Exception

  • 功能:获取任务执行过程中抛出的异常(仅在任务状态为 Faulted 时有效)

    Task task = Task.Run(() => 
    {
        throw new InvalidOperationException("出错了");
    });
    
    try
    {
        await task;
    }
    catch
    {
        if (task.Exception != null)
        {
            Console.WriteLine(task.Exception.InnerException.Message);
        }
    }

6.任务延时

1.Task.Delay(int millisecondsDelay)

  • 功能:创建一个延迟指定时间后完成的任务(非阻塞)

  • 用途:替代 Thread.SleepSleep 阻塞线程,Delay 仅暂停任务)

  • Console.WriteLine("开始等待");
    await Task.Delay(2000); // 异步等待2秒,不阻塞线程
    Console.WriteLine("等待结束");