0Pricing
C# Academy · Lezione

Task/ValueTask e macchina a stati async (concetti)

Comprendete i risultati di Task e il concetto di macchina a stati async. Scrivete piccoli metodi asincroni, componete gli await e osservate un uso manuale di TaskCompletionSource.

Task/ValueTask e macchina a stati async (concetti) è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Modello mentale

Obiettivo: sviluppare un'intuizione sul funzionamento dell'asincronia.

  • Task rappresenta un'attività in corso e un risultato futuro
  • await mette in pausa l'esecuzione e la riprende in seguito
  • Il compilatore crea una macchina a stati
  • ValueTask: un'ottimizzazione più recente (qui solo a livello concettuale)

Nozioni di base sui metodi asincroni

Un metodo async restituisce immediatamente un Task<T>; in seguito viene completato con il valore quando termina il lavoro atteso.

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);
  }
}

Comporre più await

await consente di scrivere passaggi asincroni sequenziali con uno stile chiaro e dall'alto verso il basso.

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);
  }
}

Concetto di macchina a stati

Concetto: il compilatore trasforma un metodo async in una macchina a stati.

  • Le variabili locali vengono memorizzate come campi
  • Ogni await produce un nuovo stato
  • Quando il Task atteso viene completato, una continuazione riprende l'esecuzione del metodo
  • Le eccezioni vengono acquisite e impostate nel Task

Dimostrazione di TaskCompletionSource

TaskCompletionSource consente di creare un Task e segnalarne il completamento in un secondo momento; await lo utilizza come qualsiasi altro 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);
  }
}

Concetto di ValueTask

ValueTask (concetto): un tipo restituito più recente che riduce le allocazioni per i risultati spesso sincroni.

  • È utile quando i risultati sono già disponibili nella maggior parte dei casi
  • Prevede regole per evitare allocazioni aggiuntive
  • Non è disponibile in C# 6: qui usi Task; i concetti restano validi

Macchina a stati asincrona

Verifica rapida: che cosa genera il compilatore C# per un metodo async che usa await?

Riepilogo

Riepilogo: Task rappresenta il lavoro; await mette in pausa e riprende l'esecuzione; il compilatore crea una macchina a stati. ValueTask è un concetto di ottimizzazione (in C# 6 usi Task).

Domande Frequenti

La lezione «Task/ValueTask e macchina a stati async (concetti)» è gratuita?

Sì — il testo completo di «Task/ValueTask e macchina a stati async (concetti)» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Task/ValueTask e macchina a stati async (concetti)»?

Comprendete i risultati di Task e il concetto di macchina a stati async. Scrivete piccoli metodi asincroni, componete gli await e osservate un uso manuale di TaskCompletionSource. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 3.

Quanto tempo richiede la lezione «Task/ValueTask e macchina a stati async (concetti)»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Task/ValueTask e macchina a stati async (concetti)
  2. Problemi comuni dell’asincronia: sync-over-async e deadlock
  3. ConfigureAwait, flusso delle eccezioni
← Torna a C# Academy