Partilhar via


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 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.

Observação

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

Orientações

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 IAsyncResult, faça-o como uma opção avançada. Por exemplo, se geres um objeto proxy, gera o padrão baseado em evento por predefinição, com uma opção para gerar o padrão IAsyncResult.

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

  • 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 orientado a eventos e o padrão IAsyncResult na mesma classe quando a compatibilidade o 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 tiver de expor tanto o padrão baseado em eventos como o padrão IAsyncResult numa única classe, use EditorBrowsableAttribute definido para Advanced para marcar a implementação do padrão IAsyncResult como uma funcionalidade avançada. Isso indica que os ambientes de design, como o IntelliSense do Visual Studio, não devem exibir as propriedades e métodos IAsyncResult. 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 porque cria mais objetos, especialmente EventArgs, 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 o padrão IAsyncResult apenas se tiver requisitos de alto desempenho que tenha verificado não poderem ser atendidos pelo padrão baseado em eventos, mas que podem ser atendidos pelo padrão IAsyncResult.

Ver também