Compartilhar via


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

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:

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