C# Academy · 课时

Task/ValueTask 与异步状态机(概念)

理解 Task 结果和异步状态机的理念。编写小型异步方法,组合 await,并了解手动创建的 TaskCompletionSource。

第 1 / 3 课8 个步骤

Task/ValueTask 与异步状态机(概念) 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。

心智模型

目标:建立对异步的直觉理解。

  • Task 表示正在进行的工作以及未来的结果
  • await 会暂停执行,并在之后恢复
  • 编译器会创建一个状态机
  • ValueTask:较新的优化方式(本课只介绍概念)

异步方法基础

async 方法会立即返回 Task<T>;等待的工作完成后,它会在稍后携带结果完成。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Tiny async method: returns Task<int>
  static async Task<int> GetAnswerAsync()
  {
    // Offload simple work to a thread-pool task (demo only)
    int value = await Task.Run(() =>
    {
      Thread.Sleep(200); // simulate work
      return 42;
    });
    return value; // completes Task<int>
  }

  public static void Main(string[] args)
  {
    // In C# 6, Main cannot be async; block just for demo (console apps are safe here)
    int result = GetAnswerAsync().Result;
    Console.WriteLine("Answer = " + result);
  }
}

组合等待操作

使用 await,您可以用清晰的自上而下风格编写顺序执行的异步步骤。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<int> Step1Async()
  {
    // pretend I/O
    await Task.Delay(100);
    return 10;
  }

  static async Task<int> Step2Async(int x)
  {
    await Task.Delay(100);
    return x * 3; // simple transform
  }

  static async Task<int> PipelineAsync()
  {
    int a = await Step1Async();   // await first
    int b = await Step2Async(a);  // then await second
    return a + b;                 // total 10 + 30 = 40
  }

  public static void Main(string[] args)
  {
    int total = PipelineAsync().Result; // block in demo
    Console.WriteLine("Total = " + total);
  }
}

状态机理念

概念:编译器会将异步方法转换为状态机。

  • 局部变量会存储为字段
  • 每个 await 都会产生一个新状态
  • 等待的 Task 完成后,延续会恢复执行该方法
  • 异常会被捕获并设置到 Task 上

TaskCompletionSource 演示

TaskCompletionSource 允许您创建一个 Task,并在稍后发出完成信号;await 可以像使用其他 Task 一样使用它。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Emulate an async source that completes later
  static Task<string> MakeTaskManually()
  {
    var tcs = new TaskCompletionSource<string>();
    // Complete on a worker after a short delay
    ThreadPool.QueueUserWorkItem(_ =>
    {
      Thread.Sleep(150);
      tcs.SetResult("done");
    });
    return tcs.Task;
  }

  static async Task<string> UseAsyncSource()
  {
    string s = await MakeTaskManually(); // await a Task you created
    return s.ToUpperInvariant();
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(UseAsyncSource().Result);
  }
}

ValueTask 概念

ValueTask(概念):一种较新的返回类型,可为经常同步完成的结果节省分配。

  • 当结果大多数时间都已经可用时很有用
  • 具有避免额外分配的使用规则
  • C# 6 不支持它——本课使用 Task;相关理念仍然适用

异步状态机

快速检查:对于使用 await 的异步方法,C# 编译器会生成什么?

回顾

回顾:Task 对工作进行建模;await 会暂停并恢复执行;编译器会构建一个状态机。ValueTask 是一种优化理念(在 C# 6 中使用 Task)。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「Task/ValueTask 与异步状态机(概念)」课时是免费的吗?

是的 — 「Task/ValueTask 与异步状态机(概念)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「Task/ValueTask 与异步状态机(概念)」这节课中我会学到什么?

理解 Task 结果和异步状态机的理念。编写小型异步方法,组合 await,并了解手动创建的 TaskCompletionSource。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「Task/ValueTask 与异步状态机(概念)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Task/ValueTask 与异步状态机(概念)
  2. 异步陷阱:同步阻塞异步与死锁
  3. ConfigureAwait 与异常流转
← 返回 C# Academy