Decidindo quando implementar o padrão assíncrono com base em eventos
O padrão assíncrono baseado em eventoo fornece um padrão para expor o comportamento assíncrono de uma classe.Com a introdução desse padrão, a .NET Framework define dois padrões para expor o comportamento assíncrono: o padrão assíncrono com base na System.IAsyncResult interface e o evento - baseados em padrão. Este tópico descreve quando é adequado para implementar ambos os padrões.
Para obter mais informações sobre a programação assíncrono com o IAsyncResult interface, consulte Padrões de design de programação assíncrono.
Princípios Geral
Em geral, você deve expor recursos assíncrono usando o padrão assíncrono baseado em eventoo sempre que possível.No entanto, existem alguns requisitos que o evento - com base padrão não conseguem atender.Nesses casos, talvez você precise implementar o IAsyncResult Além do padrão de evento - baseados em padrão.
Observação: |
---|
É raro que o IAsyncResult padrão a ser implementado sem o evento - com base padrão também sendo implementado. |
Diretrizes
A lista a seguir descreve as diretrizes de quando você deve implementar evento-based padrão assíncrono:
Use o evento - com base padrão sistema autônomo o padrão de API para expor o comportamento assíncrono para sua classe.
Não exponha a IAsyncResult padrão quando a classe é usada principalmente em um aplicativo cliente, por exemplo, Windows Forms.
Expor somente o IAsyncResult padrão quando é necessário para atender suas necessidades. Por exemplo, compatibilidade com uma API existente pode exigir que você para expor o IAsyncResult padrão.
Não exponha a IAsyncResult padrão sem expor também o padrão com base em eventos.
Se você deve expor o IAsyncResult padrão, fazê-lo sistema autônomo uma opção avançada. Por exemplo, se você gerar um objeto proxy, geram a evento - baseados em padrão por padrão, com uma opção para gerar o IAsyncResult padrão.
Criar seu evento-com base no padrão de implementação em seu IAsyncResult implementação do padrão.
Evite expor ambos o evento-baseada em padrão e o IAsyncResult padrão da mesma classe. Expor o evento-com base padrão em classes mais alto nível “ ” e o IAsyncResult padrão em classes “ Diminuir nível ”. Por exemplo, comparar o evento - com base padrão sobre o WebClient componente com o IAsyncResult padrão na HttpRequest classe.
Expor o evento-baseada em padrão e o IAsyncResult padrão da mesma classe quando compatibilidade requê-lo. Por exemplo, se você já ter lançado uma API que usa o IAsyncResult padrão, você precisará manter o IAsyncResult padrão para compatibilidade com versões anteriores.
Expor o evento-baseada em padrão e o IAsyncResult padrão da mesma classe se a complexidade do modelo de objeto resultante supera o benefício de separar as implementações. É melhor para expor os dois padrões em uma única classe que evite expor a evento - baseados em padrão.
Se você deve expor ambos o evento-baseada em padrão e IAsyncResult padrão de uma classe única, uso EditorBrowsableAttribute definido sistema autônomo Advanced para marcar o IAsyncResult implementação do padrão sistema autônomo um recurso avançado. Isso indica a ambientes de design, sistema autônomo Visual Studio IntelliSense, não para exibir o IAsyncResult propriedades e métodos. Essas propriedades e métodos ainda são totalmente utilizáveis, mas o desenvolvedor trabalhando através do IntelliSense possui uma exibição mais clara da API.
Critérios para expondo o padrão IAsyncResult além do evento-com base em padrões
Enquanto o padrão assíncrono evento-based tem muitos benefícios em cenários mencionados anteriormente, ele tem algumas desvantagens, que deve estar ciente de desempenho é o requisito mais importante.
Há três cenários não padrão com base em eventos endereço, bem sistema autônomo a IAsyncResult padrão:
Bloqueio de espera em um IAsyncResult
Bloqueio de espera em muitos IAsyncResult objetos
sondagem para conclusão no IAsyncResult
Você pode lidar com esses cenários por meio do evento - com base no padrão, mas fazer isso é mais complicado do que usar o IAsyncResult padrão.
Os desenvolvedores normalmente usam o IAsyncResult padrão para serviços que normalmente têm requisitos de desempenho muito alto. Por exemplo, a sondagem para cenário de conclusão é uma técnica de servidor de alto desempenho.
Além disso, o evento - com base padrão é menos eficiente do que o IAsyncResult padrão porque ele cria mais objetos, especialmente EventArgs, e porque ele sincroniza pelos threads.
A lista a seguir mostra algumas recomendações a seguir se você decidir usar o IAsyncResult padrão:
Expor somente o IAsyncResult padrão quando você precisa de suporte para especificamente WaitHandle ou IAsyncResult objetos.
Expor somente o IAsyncResult padrão quando você tem uma API existente que usa o IAsyncResult padrão.
Se você tiver uma API existente com base na IAsyncResult padrão, considere também expondo o evento - com base padrão em sua próxima versão.
Expor somente IAsyncResult padrão se você tiver requisitos de alto desempenho que você verificou não podem ser atendida pelo padrão com base em eventos, mas podem ser atendida pela IAsyncResult padrão.
Consulte também
Tarefas
Conceitos
Implementando o padrão assíncrono baseado em evento
Práticas recomendadas para implementar o padrão assíncrono com base em eventos
padrão assíncrono baseado em evento Visão geral sobre
Outros recursos
Padrões de design de programação assíncrono
Vários segmentos de programação com o padrão assíncrono baseado em eventoo