Padrões de programação assíncronos
.NET fornece três padrões para a realização de operações assíncronos:
Padrões Assíncronos baseados em tarefas (TAP), que utiliza um único método para representar o início e a conclusão de uma operação assíncronea. A TAP foi introduzida no .NET Framework 4. É a abordagem recomendada para a programação assíncronea em .NET. As palavras-chave async e aguardam palavras-chave em C# e os operadores Async e Await em Visual Basic adicionar suporte linguístico à TAP. Para obter mais informações, consulte o Padrão Assíncrodo (TAP) baseado em tarefas.
Padrão Assíncronos baseado em eventos (EAP), que é o modelo legado baseado em eventos para fornecer comportamento assíncronos. Requer um método que tenha o
Async
sufixo e um ou mais eventos, tipos de delegados de manipulador de eventos eEventArg
tipos derivados. A EAP foi introduzida em .NET Framework 2.0. Já não é recomendado para novos desenvolvimentos. Para obter mais informações, consulte o Padrão Assíncrodo (EAP) baseado no evento.Padrão de Programação Assíncronia (APM) (também chamado de IAsyncResult padrão), que é o modelo legado que usa a IAsyncResult interface para fornecer comportamento assíncronos. Neste padrão, as operações sincronizadas requerem
Begin
eEnd
métodos (por exemplo,BeginWrite
eEndWrite
implementar uma operação de escrita assíncroa). Este padrão já não é recomendado para novos desenvolvimentos. Para mais informações, consulte o Modelo de Programação Assíncronos (APM).
Comparação de padrões
Para uma comparação rápida de como os três padrões modelam operações assíncronos, considere um Read
método que leia uma quantidade especificada de dados num tampão fornecido a partir de uma compensação especificada:
public class MyClass
{
public int Read(byte [] buffer, int offset, int count);
}
A contrapartida da TAP deste método exporia o seguinte método único ReadAsync
:
public class MyClass
{
public Task<int> ReadAsync(byte [] buffer, int offset, int count);
}
A contrapartida EAP exporia o seguinte conjunto de tipos e membros:
public class MyClass
{
public void ReadAsync(byte [] buffer, int offset, int count);
public event ReadCompletedEventHandler ReadCompleted;
}
A contrapartida da APM exporia os BeginRead
métodos e EndRead
métodos:
public class MyClass
{
public IAsyncResult BeginRead(
byte [] buffer, int offset, int count,
AsyncCallback callback, object state);
public int EndRead(IAsyncResult asyncResult);
}