C#Task(Api)应用

目录

1.线程创建和启动

2.任务等待与组合

3.任务延续

4.任务取消

5.任务状态与信息

6.任务延时


1.线程创建和启动

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

  • 功能:在线程池上启动一个任务(最常用的创建方式)
  • 特点 :自动调度到线程池,返回可等待的 Task 或 Task<TResult>
cs 复制代码
// 无返回值任务
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() 才会执行,可指定调度器

    cs 复制代码
    Task task = new Task(() => Console.WriteLine("手动启动的任务"));
    task.Start(); // 启动任务
    await task;

3.Task.Factory.StartNew(Action)

  • 功能:通过工厂方法创建并启动任务

  • 特点 :支持更多创建选项(如任务优先级、是否长时间运行)

    cs 复制代码
    // 创建长时间运行的任务(可能会创建新线程而非使用线程池)
    Task longTask = Task.Factory.StartNew(
        () => { /* 长时间运行的操作 */ },
        TaskCreationOptions.LongRunning
    );

2.任务等待与组合

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

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

2.awat关键字

  • 功能:异步等待任务完成(不阻塞当前线程)

  • 特点 :必须在 async 方法中使用

    cs 复制代码
     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>)
cs 复制代码
Task task1 = Task.Run(() => Task.Delay(1000));
Task task2 = Task.Run(() => Task.Delay(2000));
await Task.WhenAll(task1, task2); // 等待两个任务都完成

4.Task.WhenAny(Task[])

  • 功能:等待任一任务完成后就继续
  • 返回值:第一个完成的任务
cs 复制代码
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>)

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

2.延续选项(TaskContinuationOptions)

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

cs 复制代码
Task task = Task.Run(() => 
{
    throw new Exception("任务失败");
});

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

4.任务取消

1.CancellationTokenSource / CancellationToken

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

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

cs 复制代码
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(出错)

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

2.Task.Exception

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

    cs 复制代码
    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.Sleep(Sleep 阻塞线程,Delay 仅暂停任务)

cs 复制代码
Console.WriteLine("开始等待");
await Task.Delay(2000); // 异步等待2秒,不阻塞线程
Console.WriteLine("等待结束");
相关推荐
§ꦿCFོ༉29 分钟前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠1 小时前
十种不同风格的 CTP接口 框架
开发语言·python
爱笑的k114 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
用户3721574261354 小时前
C# 提取 PDF 附件:包括文档附件和页面注释附件
c#
寂寞的船5 小时前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
X1A0RAN5 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
熊猫钓鱼>_>7 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮7 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克6058 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克6059 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型