Decidindo quando implementar o padrão assíncrono baseado em eventos

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 System.IAsyncResult baseado na interface e o padrão baseado em evento. Este artigo descreve quando é apropriado implementar ambos os padrões.

Para obter mais informações sobre programação assíncrona com a interface, consulte Modelo de programação assíncrona IAsyncResult (APM).

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 eventos não pode atender. Nesses casos, talvez seja necessário implementar o IAsyncResult padrão além do padrão baseado em eventos.

Nota

É raro que o IAsyncResult padrão seja implementado sem que o padrão baseado em eventos também seja implementado.

Diretrizes

A lista a seguir descreve as diretrizes para quando você deve implementar o padrão assíncrono baseado em eventos:

  • Use o padrão baseado em eventos como a API padrão para expor o comportamento assíncrono da sua classe.

  • Não exponha o IAsyncResult padrão quando sua classe é usada principalmente em um aplicativo cliente, por exemplo, Windows Forms.

  • Exponha o IAsyncResult padrão apenas quando for necessário para atender às suas necessidades. 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 também expor o padrão baseado em eventos.

  • Se tiver de expor o padrão, faça-o IAsyncResult como uma opção avançada. Por exemplo, se você gerar um objeto proxy, gere o padrão baseado em evento por padrão, com uma opção para gerar o IAsyncResult padrão.

  • Crie sua implementação de padrão baseada em eventos com base em sua IAsyncResult implementação de padrão.

  • Evite expor o padrão baseado em evento e o IAsyncResult padrão na mesma classe. Exponha o padrão baseado em eventos em classes de "nível superior" e o IAsyncResult padrão 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 eventos e o IAsyncResult padrão na mesma classe quando a compatibilidade exigir. 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 eventos 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 eventos.

    • Se você precisar expor o padrão baseado em eventos e IAsyncResult o padrão em uma única classe, use EditorBrowsableAttribute set to Advanced para marcar a implementação do IAsyncResult padrão 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 IAsyncResult métodos. Essas propriedades e métodos ainda são totalmente utilizáveis, mas o desenvolvedor que trabalha com o 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 eventos tenha muitos benefícios nos cenários mencionados anteriormente, ele tem algumas desvantagens, que você deve estar ciente se o desempenho for 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:

Você pode abordar 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, o cenário de sondagem para conclusão é uma técnica de servidor de alto desempenho.

Além disso, o padrão baseado em eventos é menos eficiente do que o IAsyncResult padrão porque cria mais objetos, especialmente EventArgso , e porque sincroniza entre threads.

A lista a seguir mostra algumas recomendações a serem seguidas se você decidir usar o IAsyncResult padrão:

  • Exponha o IAsyncResult padrão apenas quando precisar especificamente de suporte para WaitHandle ou IAsyncResult objetos.

  • Exponha o IAsyncResult padrão somente 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 eventos na próxima versão.

  • Exponha IAsyncResult o padrão somente se você tiver requisitos de alto desempenho que você verificou que não podem ser atendidos pelo padrão baseado em eventos, mas podem ser atendidos IAsyncResult pelo padrão.

Consulte também