Modelli di programmazione asincrona

In .NET sono disponibili tre modelli per l'esecuzione di operazioni asincrone:

  • Modello asincrono basato su attività , che usa un singolo metodo per rappresentare l'avvio e il completamento di un'operazione asincrona. TAP è stato introdotto in .NET Framework 4. È l'approccio consigliato per la programmazione asincrona in .NET. Le parole chiave async e await in C# e gli operatori Async e Await in Visual Basic aggiungono il supporto del linguaggio per TAP. Per altre informazioni, vedere Task-based Asynchronous Pattern (TAP) (Modello asincrono basato su attività, TAP).

  • Modello asincrono basato su eventi (EAP), ovvero il modello legacy basato su eventi per fornire il comportamento asincrono. Richiede un metodo con il suffisso Async e uno o più eventi, i tipi delegati del gestore eventi e i tipi derivati da EventArg. EAP è stato introdotto in .NET Framework 2.0. Questo modello non è più consigliato per i nuovi progetti di sviluppo. Per ulteriori informazioni, vedere Event-based Asynchronous Pattern (EAP) (Modello asincrono basato su eventi, EAP).

  • Il modello di programmazione asincrona (APM) (chiamato anche modello IAsyncResult) è il modello legacy che usa l'interfaccia IAsyncResult per fornire il comportamento asincrono. In questo modello, le operazioni sincrone richiedono i metodi Begin e End (ad esempio BeginWrite e EndWrite per implementare un'operazione di scrittura asincrona). Questo modello non è più consigliato per i nuovi sviluppi. Per altre informazioni, vedere Asynchronous Programming Model (APM) (Modello di programmazione asincrona, APM).

Confronto dei modelli

Per un rapido confronto tra le procedure delle operazioni asincrone dei tre modelli, considerare un metodo Read che legga una specifica quantità di rati in un determinato buffer, iniziando da uno specifico offset:

public class MyClass  
{  
    public int Read(byte [] buffer, int offset, int count);  
}  

La controparte TAP di questo metodo espone il seguente metodo ReadAsync singolo:

public class MyClass  
{  
    public Task<int> ReadAsync(byte [] buffer, int offset, int count);  
}  

La controparte EAP esporrà il seguente set di tipi e membri:

public class MyClass  
{  
    public void ReadAsync(byte [] buffer, int offset, int count);  
    public event ReadCompletedEventHandler ReadCompleted;  
}  

La controparte APM espone i metodi BeginRead e EndRead:

public class MyClass  
{  
    public IAsyncResult BeginRead(  
        byte [] buffer, int offset, int count,
        AsyncCallback callback, object state);  
    public int EndRead(IAsyncResult asyncResult);  
}  

Vedi anche