Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O padrão assíncrono baseado em evento fornece um padrão para expor o comportamento assíncrono de uma classe. Com a introdução desse padrão, o .NET define dois padrões para expor o comportamento assíncrono: o padrão assíncrono baseado na System.IAsyncResult interface e o padrão baseado em eventos. Este artigo descreve quando é apropriado implementar ambos os padrões.
Para obter mais informações sobre programação assíncrona com a IAsyncResult interface, consulte APM (Modelo de Programação Assíncrono).
Princípios Gerais
Em geral, você deve expor recursos assíncronos usando o padrão assíncrono baseado em evento sempre que possível. No entanto, há alguns requisitos que o padrão baseado em evento não pode atender. Nesses casos, talvez seja necessário implementar o IAsyncResult padrão além do padrão baseado em evento.
Observação
É raro que o IAsyncResult padrão seja implementado sem que o padrão baseado em evento também seja implementado.
Diretrizes
A lista a seguir descreve as diretrizes para quando você deve implementar o Padrão Assíncrono baseado em evento:
Use o padrão baseado em evento como a API padrão para expor o comportamento assíncrono para sua classe.
Não exponha o IAsyncResult padrão quando sua classe é usada principalmente em um aplicativo cliente, por exemplo, Windows Forms.
Exponha apenas o IAsyncResult padrão quando for necessário para atender aos seus requisitos. Por exemplo, a compatibilidade com uma API existente pode exigir que você exponha o IAsyncResult padrão.
Não exponha o IAsyncResult padrão sem expor também o padrão baseado em evento.
Se você precisar expor o padrão IAsyncResult, faça isso como uma opção avançada. Por exemplo, se você gerar um objeto proxy, o padrão baseado em evento será gerado por padrão, com uma opção para gerar o padrão IAsyncResult.
Crie sua implementação do padrão baseado em evento na implementação do padrão IAsyncResult.
Evite expor o padrão baseado em evento e o IAsyncResult padrão na mesma classe. Revele o padrão orientado a eventos em classes de "nível superior" e o padrão IAsyncResult em classes de "nível inferior". Por exemplo, compare o padrão baseado em evento no WebClient componente com o IAsyncResult padrão na HttpRequest classe.
Exponha o padrão baseado em evento e o padrão IAsyncResult na mesma classe quando a compatibilidade exigir isso. Por exemplo, se você já lançou uma API que usa o IAsyncResult padrão, precisará manter o IAsyncResult padrão para compatibilidade com versões anteriores.
Exponha o padrão baseado em evento e o IAsyncResult padrão na mesma classe se a complexidade do modelo de objeto resultante superar o benefício de separar as implementações. É melhor expor ambos os padrões em uma única classe do que evitar expor o padrão baseado em evento.
Se você precisar expor tanto o padrão baseado em eventos quanto o padrão IAsyncResult em uma única classe, configure EditorBrowsableAttribute para Advanced marcar a implementação do padrão IAsyncResult como um recurso avançado. Isso indica que os ambientes de design, como o Visual Studio IntelliSense, não devem exibir as propriedades e os métodos IAsyncResult. Essas propriedades e métodos ainda são totalmente utilizáveis, mas o desenvolvedor que trabalha por meio do IntelliSense tem uma visão mais clara da API.
Critérios para expor o padrão IAsyncResult além do padrão baseado em evento
Embora o Padrão Assíncrono baseado em evento tenha muitos benefícios nos cenários mencionados anteriormente, ele tem algumas desvantagens, que você deve estar ciente se o desempenho é seu requisito mais importante.
Há três cenários que o padrão baseado em evento não aborda tão bem quanto o IAsyncResult padrão:
Bloqueio da espera em um IAsyncResult
Bloqueio da espera em vários objetos IAsyncResult
Sondagem de conclusão no IAsyncResult
Você pode resolver esses cenários usando o padrão baseado em evento, mas fazer isso é mais complicado do que usar o IAsyncResult padrão.
Os desenvolvedores geralmente usam o IAsyncResult padrão para serviços que normalmente têm requisitos de desempenho muito altos. Por exemplo, a sondagem do cenário de conclusão é uma técnica de servidor de alto desempenho.
Além disso, o padrão baseado em evento é menos eficiente do que o IAsyncResult padrão porque cria mais objetos, especialmente EventArgs, e porque sincroniza entre threads.
A lista a seguir mostra algumas recomendações a seguir se você decidir usar o IAsyncResult padrão:
Exponha apenas o IAsyncResult padrão quando você precisar especificamente de suporte para WaitHandle ou IAsyncResult objetos.
Exponha apenas o IAsyncResult padrão quando você tiver uma API existente que use o IAsyncResult padrão.
Se você tiver uma API existente com base no IAsyncResult padrão, considere também expor o padrão baseado em evento em sua próxima versão.
Apenas exponha o padrão IAsyncResult se você tiver requisitos de alto desempenho que verificou que não podem ser atendidos pelo padrão baseado em eventos, mas podem ser atendidos pelo padrão IAsyncResult.
Consulte também
- Como implementar um componente que dá suporte ao padrão assíncrono baseado em evento
- Padrão assíncrono baseado em evento (EAP)
- Implementando o padrão assíncrono baseado em evento
- Práticas recomendadas para implementar o padrão assíncrono baseado em evento
- Visão geral do padrão assíncrono baseado em evento