C#Task(Api)应用

目录

1.线程创建和启动

2.任务等待与组合

3.任务延续

4.任务取消

5.任务状态与信息

6.任务延时


1.线程创建和启动

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

  • 功能:在线程池上启动一个任务(最常用的创建方式)
  • 特点 :自动调度到线程池,返回可等待的 TaskTask<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.SleepSleep 阻塞线程,Delay 仅暂停任务)

cs 复制代码
Console.WriteLine("开始等待");
await Task.Delay(2000); // 异步等待2秒,不阻塞线程
Console.WriteLine("等待结束");
相关推荐
hsg7714 分钟前
简述:Rust、GeoRust、自主研发GIS平台
开发语言·后端·rust
承渊政道24 分钟前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
wdfk_prog6 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
许彰午10 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系10 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜10 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
chouchuang12 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空13 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen13 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
C137的本贾尼13 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件