Condividi tramite


Modelli di programmazione asincroni

.NET offre tre modelli per l'esecuzione di operazioni asincrone:

  • Modello asincrono basato su attività (TAP), che usa un singolo metodo per rappresentare l'avvio e il completamento di un'operazione asincrona. TAP è stato introdotto in .NET Framework 4. Si tratta dell'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 Modello asincrono basato su attività (TAP).

  • Modello asincrono basato su eventi (EAP), ovvero il modello legacy basato su eventi per fornire un comportamento asincrono. Richiede un metodo con il Async suffisso e uno o più eventi, tipi di delegate dei gestori eventi e tipi derivati da EventArg. EAP è stato introdotto in .NET Framework 2.0. Non è più consigliato per il nuovo sviluppo. Per altre informazioni, vedere Modello asincrono basato su eventi (EAP).

  • Modello di programmazione asincrona ( chiamato IAsyncResult anche modello), ovvero il modello legacy che usa l'interfaccia IAsyncResult per fornire un comportamento asincrono. In questo modello, le operazioni asincrone richiedono Begin metodi e End (ad esempio, BeginWrite e EndWrite per implementare un'operazione di scrittura asincrona). Questo modello non è più consigliato per il nuovo sviluppo. Per altre informazioni, vedere Modello di programmazione asincrona .

Confronto tra modelli

Per un rapido confronto del modo in cui i tre modelli modellano le operazioni asincrone, prendere in considerazione un Read metodo che legge una quantità specificata di dati in un buffer specificato a partire da un offset specificato:

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

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

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

La controparte EAP esporrebbe il seguente insieme di tipi e membri:

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

La controparte di APM esporrebbe 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);  
}  

Vedere anche