Task/ValueTask 与异步状态机(概念)
理解 Task 结果和异步状态机的理念。编写小型异步方法,组合 await,并了解手动创建的 TaskCompletionSource。
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;相关理念仍然适用
异步状态机
回顾
回顾: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 反馈 — 无需本地设置。
此课程中的所有课时
- Task/ValueTask 与异步状态机(概念)
- 异步陷阱:同步阻塞异步与死锁
- ConfigureAwait 与异常流转