Task/ValueTask y la máquina de estados async (conceptos)
Comprenda los resultados de Task y la idea de la máquina de estados async. Escriba métodos async pequeños, componga awaits y observe un TaskCompletionSource manual.
Task/ValueTask y la máquina de estados async (conceptos) es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 3 lecciones en total.
Modelo mental
Objetivo: Desarrolle una intuición sobre la asincronía.
- Task representa un trabajo en curso y un resultado futuro
- await pausa la ejecución y la reanuda más tarde
- El compilador crea una máquina de estados
- ValueTask: una optimización más reciente (solo se presenta el concepto)
Conceptos básicos de los métodos async
Un método async devuelve Task<T> inmediatamente; después se completa con el valor cuando finaliza el trabajo esperado.
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);
}
}
Composición de operaciones await
await permite escribir pasos asíncronos secuenciales con un estilo claro, de arriba abajo.
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);
}
}
Idea de la máquina de estados
Concepto: El compilador transforma un método async en una máquina de estados.
- Las variables locales se almacenan como campos
- Cada await produce un estado nuevo
- Cuando se completa el Task esperado, una continuación reanuda el método
- Las excepciones se capturan y se asignan al Task
Demostración de TaskCompletionSource
TaskCompletionSource permite crear un Task y señalar su finalización más tarde; await lo consume como cualquier otro 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);
}
}
Concepto de ValueTask
ValueTask (concepto): un tipo de retorno más reciente que ahorra asignaciones para resultados que suelen estar disponibles de forma síncrona.
- Resulta útil cuando los resultados ya están disponibles la mayor parte del tiempo
- Tiene reglas para evitar asignaciones adicionales
- No está disponible en C# 6; use Task aquí, aunque las ideas sigan siendo aplicables
Máquina de estados asíncrona
Resumen
Resumen: Task representa el trabajo; await pausa y reanuda la ejecución; el compilador construye una máquina de estados. ValueTask es un concepto de optimización (use Task en C# 6).
Preguntas frecuentes
¿La lección «Task/ValueTask y la máquina de estados async (conceptos)» es gratis?
Sí — el texto completo de «Task/ValueTask y la máquina de estados async (conceptos)» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 3 lecciones en total.
¿Qué aprenderé en «Task/ValueTask y la máquina de estados async (conceptos)»?
Comprenda los resultados de Task y la idea de la máquina de estados async. Escriba métodos async pequeños, componga awaits y observe un TaskCompletionSource manual. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 3.
¿Cuánto tiempo toma la lección «Task/ValueTask y la máquina de estados async (conceptos)»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Task/ValueTask y la máquina de estados async (conceptos)
- Errores comunes de async: sync-over-async y deadlocks
- ConfigureAwait y flujo de excepciones