Padrões de programação assíncrona

O .NET fornece três padrões para a execução de operações assíncronas:

  • TAP (padrão assíncrono baseado em tarefa), que usa um único método para representar o início e a conclusão de uma operação assíncrona. O TAP foi introduzido no .NET Framework 4. É a abordagem recomendada para a programação assíncrona no .NET. As palavras-chave async e await no C# e os operadores Async e Await no Visual Basic adicionam suporte à linguagem para TAP. Para saber mais, confira Padrão assíncrono baseado em tarefa (TAP).

  • Padrão assíncrono baseado em evento (EAP), que é o modelo herdado baseado em evento para fornecimento do comportamento assíncrono. Ele requer um método que tem o sufixo Async e um ou mais eventos, tipos delegados de manipulador de eventos e tipos derivados de EventArg. O EPAP foi introduzido no .NET Framework 2.0. Não é mais recomendado para novo desenvolvimento. Para saber mais, confira EAP (Padrão Assíncrono baseado em Evento).

  • Padrão de Modelo de programação assíncrona (APM) (também chamado de padrão IAsyncResult), que é o modelo herdado que usa a interface IAsyncResult para fornecimento do comportamento assíncrono. Nesse padrão, as operações síncronas exigem os métodos Begin e End (por exemplo, BeginWrite e EndWrite para implementar uma operação de gravação assíncrona). Esse padrão não é mais recomendado para implantação nova. Para saber mais, veja APM (Modelo Assíncrono de Programação).

Comparação de padrões

Para obter uma comparação rápida de como os três padrões modelam as operações assíncronas, considere um método Read que lê uma quantidade especificada de dados em um buffer fornecido começando em um deslocamento especificado:

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

O equivalente do TAP para este método poderia expor o método único ReadAsync a seguir:

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

O equivalente do EAP poderia expor o seguinte conjunto de tipos e membros:

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

O equivalente do APM poderia expor os métodos BeginRead e EndRead:

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

Confira também