C#异步编程 - Task的用法总结

在C#中,Task是异步编程的核心类型,它代表一个异步操作。它是对线程的更高级抽象,大大简化了异步和并行编程。

Task 状态

  • Created: 任务已通过构造函数创建,但尚未被安排(例如,通过Start()或TaskFactory.StartNew()方法安排执行)。
  • WaitingForActivation: 任务正在等待被安排到任务调度程序。这种状态通常用于由异步操作(如async/await)创建的任务,或者通过TaskCompletionSource创建的任务。
  • WaitingToRun: 任务已被安排执行,但尚未开始执行。它可能在等待线程可用。
  • Running: 正在运行,但尚未完成。
  • WaitingForChildrenToComplete:任务已经完成其本身的执行,并正在等待附加的子任务完成。只有当任务创建了子任务,并且父任务配置为等待子任务完成时,才会进入此状态。
  • RanToCompletion: 成功完成,没有抛出未处理的异常,也没有被取消。
  • Faulted: 因未处理的异常而完成。
  • Canceled: 任务已通过取消操作完成。这通常是由于CancellationToken被触发,任务通过抛出OperationCanceledException来响应取消请求。

创建和启动 Task

1.使用 Task.Run() (最常用)

用于将工作项排队到线程池,并返回一个表示该工作的 Task 或 Task。

// 用于无返回值的方法Task task = Task.Run(() =>{
  
      Console.WriteLine("在线程池线程上执行的任务");    Thread.Sleep(1000);});task.Wait(); // 阻塞等待任务完成// 用于有返回值的方法Task<int> taskWithResult = Task.Run(() =>{
  
      Console.WriteLine("计算中...");    return 42;});

2.使用 Task.Factory.StartNew()

比 Task.Run 提供更多选项(如任务创建选项、自定义调度器),但在大多数简单场景下,Task.Run 是首选。

ask task = Task.Factory.StartNew(() =>{
  
      // 工作代码}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

3.使用 async/await 关键字 (现代方式)

async 方法会自动将代码包装成状态机,并返回一个 Task 或 Task。

public async Task<string> DownloadStringAs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值