Aller au contenu

Transformation par le compilateur en machine à états

Contexte : Le compilateur C# transforme les méthodes async en une machine à états. Cela permet à la méthode de suspendre et de reprendre aux points await sans bloquer.

using System;
using System.Threading.Tasks;
public class Example
{
public async Task ExampleAsync()
{
Console.WriteLine("Début");
await Task.Delay(1000);
Console.WriteLine("Reprise");
}
}

Le compilateur génère une structure avec des états (0 = avant le premier await, 1 = après, etc.), conservant les variables locales.

  • Pas de magie avec les threads : la méthode s’exécute sur le contexte de synchronisation d’origine après l’await.
  • Efficace : aucun thread supplémentaire n’est créé pour attendre.

Applications UI : Dans WPF ou WinForms, await revient automatiquement sur le thread UI (sauf si vous utilisez ConfigureAwait(false)).

Exemple : Async en profondeur