Compartilhar via


Mais informações sobre interfaces que IObservable e IEnumerable no StreamInsight

Este tópico contém mais informações que ajudarão a entender o suporte a origens e coletores de eventos observáveis e enumeráveis no StreamInsight.

Suporte para interfaces IObservable e IEnumerable no StreamInsight

Visão geral das interfaces IObservable e IEnumerable

A interface IObservable fornece o seguinte método:

Método

Descrição

Subscribe

Cria e retorna uma assinatura que implementa a interface IObserver.

A interface IObserver fornece os seguintes métodos:

Método

Descrição

OnNext

Notifica o observador que há um novo valor na sequência.

OnError

Notifica o observador que ocorreu uma exceção e a sequência foi encerrada.

Nenhuma chamada para OnNext, OnCompleted ou OnError pode seguir esta chamada.

OnCompleted

Notifica o observador que a sequência terminou.

Nenhuma chamada para OnNext, OnCompleted ou OnError pode seguir esta chamada.

Dispose

Remove a assinatura.

Entrada de uma origem de eventos IObservable

Quando você inicia uma consulta que está associada a uma entrada observável, o StreamInsight chama o método IObservable.Subscribe da origem de eventos, uma assinatura é criada e a origem de eventos começa a fornecer dados. A entrada pode reportar um encerramento normal de seus dados de origem chamando IObserver.OnCompleted. Ou o usuário pode interromper a entrada removendo a assinatura.

Exceções e manipulação de exceção

Quando a consulta StreamInsight consome uma entrada observável, você não chama os métodos das interfaces IObservable ou IObserver no código que escreve; o StreamInsight chama os métodos apropriados para você. No entanto, as seguintes informações ajudarão a entender quando as exceções podem ocorrer e como elas são manipuladas.

O adaptador da entrada mantém a referência à origem de eventos observável que fornece eventos.

  • Se uma chamada para IObservable.Subscribe gerar uma exceção, ela será propagada para o tempo de execução do StreamInsight e a consulta será anulada.

  • Se uma chamada para IObserver.Dispose gerar uma exceção, ela será registrada e ignorada.

  • Uma chamada para IObserver.OnCompleted faz o adaptador de entrada sinalizar que parou. As chamadas para os métodos IObserver que seguem esta chamada são tratadas como erros e podem lançar exceções.

  • As exceções que ocorrem em chamadas para IObserver.OnNext fazem a consulta ser anulada e a assinatura, removida. As chamadas para os métodos IObserver que seguem esta chamada são tratadas como erros e podem lançar exceções. Uma exceção em uma chamada para OnNext pode ser causada por:

    • Um evento nulo.

    • Uma violação da CTI.

    • Uma exceção lançada de uma expressão de seletor.

  • Uma chamada para IObserver.OnNext bloqueia enquanto o fluxo do adaptador de entrada está cheio e nenhum evento pode ser enfileirado.

  • Uma chamada para IObserver OnError faz a consulta ser anulada. As chamadas para os métodos IObserver que seguem esta chamada são tratadas como erros e podem lançar exceções.

Saída para um coletor de eventos IObservable

Quando o observador cria uma assinatura chamando o método Subscribe de uma saída IObservable, uma instância de uma consulta é criada e iniciada, e a saída transitória começa a fornecer dados. Uma instância de consulta existe para cada assinatura, e existe somente enquanto o consumidor existe. O StreamInsight pode reportar um encerramento normal de uma consulta chamando IObserver.OnCompleted. Ou o usuário pode interromper e implicitamente excluir a consulta removendo a assinatura. Por outro lado, uma consulta transitória não será excluída até que a assinatura correspondente seja descartada.

Exceções e manipulação de exceção

Quando você consome a saída de uma consulta StreamInsight através das interfaces IObservable e IObserver, o código que você escreve no consumidor chama os métodos destas interfaces diretamente. As seguintes informações ajudarão a entender quando as exceções podem ocorrer e como elas são manipuladas.

Quando um fluxo é convertido em uma saída IObservable, esta instância observável mantém a referência ao fluxo original. Depois disso, os observadores podem assinar para receber dados.

  • Uma chamada para IObservable.Subscribe faz uma consulta ser criada e iniciada, e começar a fornecer eventos para o observador. Subscribe poderá gerar uma exceção quando uma das seguintes condições for verdadeira:

    • O servidor não é inserido.

    • A consulta não pode ser criada.

    • A consulta não pode ser iniciada.

  • Uma chamada para IObserver.Dispose faz a consulta ser interrompida e excluída. A implementação garante que as seguintes instruções são verdadeiras:

    • Depois que a chamada para Dispose retornar, não será feita nenhuma chamada posterior para métodos IObserver.

    • A consulta subjacente será interrompida e excluída assim que possível, mas não necessariamente antes de a chamada para Dispose retornar.

    • Uma chamada para Dispose de um método IObserver não causará um deadlock.

  • IObserver.OnError é chamado quando a consulta é anulada. A implementação fornece uma exceção que contém pelo menos informações textuais sobre a falha. Depois de uma chamada para OnError, não será feita nenhuma chamada para os métodos IObserver. OnError poderá ser chamado quando uma das seguintes condições for verdadeira:

    • Um adaptador gera uma exceção.

    • Um operador gera uma exceção.

  • IObserver.OnCompleted é chamado quando a consulta terminar de processar a saída. Depois de uma chamada para OnCompleted, não será feita nenhuma chamada para os métodos IObserver. OnCompleted poderá ser chamado quando uma das seguintes condições for verdadeira:

    • O adaptador de saída recebe uma CTI de mais infinito.

    • A consulta é suspensa porque todos os eventos foram consumidos.

  • Se as chamadas para o StreamInsight dentro dos métodos IObserver (que são chamadas feitas dentro do código do usuário) gerar uma exceção, isso fará a consulta ser anulada. Se a consulta já estiver no processo de ser anulada, esta exceção será ignorada.

  • Se uma expressão de seletor gerar uma exceção, isso fará a consulta ser anulada.

Suporte para a interface IEnumerable no StreamInsight

Visão geral da interface IEnumerable

A interface IEnumerable fornece o seguinte método:

Método

Descrição

GetEnumerator

Cria e retorna um enumerador que implementa a interface IEnumerator.

A interface IEnumerator fornece os seguintes métodos:

Método

Descrição

Current

Obtém o elemento atual.

MoveNext

Avança o enumerador para o próximo elemento.

Reset

Define o enumerador como sua posição inicial, ou seja, antes do primeiro elemento.

Nenhuma chamada para outros métodos IEnumerator pode seguir esta chamada.

Dispose

Remove o enumerador.

Entrada de uma origem de eventos IEnumerable

Quando você inicia uma consulta que está associada a uma entrada transitória, o StreamInsight chama o método IEnumerable.GetEnumerator da origem de eventos e obtém o enumerador. Em seguida, a origem de eventos começa a fornecer dados chamando IEnumerator.MoveNext e IEnumerator.Current em loop, contanto que o fluxo de entrada não esteja vazio. A entrada pode reportar um encerramento normal de seus dados de origem retornando falso quando o StreamInsight chama MoveNext. Ou o usuário pode interromper a entrada removendo o enumerador.

Exceções e manipulação de exceção

Quando a consulta StreamInsight consome uma entrada enumerável, você não chama os métodos das interfaces IEnumerable ou IEnumerator no código que escreve; o StreamInsight chama os métodos apropriados para você. No entanto, as seguintes informações ajudarão a entender quando as exceções podem ocorrer e como elas são manipuladas.

O adaptador da entrada mantém a referência à origem de eventos enumerável da qual os eventos serão recebidos. O adaptador de entrada faz chamadas nesta origem de eventos em seu próprio thread para obter dados.

  • Se uma chamada para IEnumerable.GetEnumerator, or to IEnumerator.Current, IEnumerator.MoveNext, or IEnumerator.Dispose gerar uma exceção, isso fará a consulta ser anulada.

  • Se uma expressão de seletor gerar uma exceção, isso fará a consulta ser anulada.

Saída para um coletor de eventos IEnumerable

Quando o consumidor obtém um enumerador chamando o método GetEnumerator de uma saída IEnumerable, uma instância de uma consulta é criada e iniciada, e a saída transitória começa a fornecer dados. Uma instância de consulta existe para cada enumerador, e existe somente enquanto o consumidor existe. O StreamInsight pode reportar um encerramento normal de uma consulta retornando falso quando o consumidor chama IEnumerator.MoveNext. Ou o usuário pode interromper e implicitamente excluir a consulta removendo o enumerador. Por outro lado, uma consulta transitória não será excluída até que o enumerador correspondente seja descartado.

Exceções e manipulação de exceção

Quando você consome a saída de uma consulta StreamInsight através das interfaces IEnumerable e IEnumerator, o código que você escreve no consumidor chama os métodos destas interfaces diretamente. As seguintes informações ajudarão a entender quando as exceções podem ocorrer e como elas são manipuladas.

Quando um fluxo é convertido em uma saída IEnumerable, esta instância enumerável mantém a referência ao fluxo original. Os consumidores chamam os métodos de IEnumerable e IEnumerator para receber dados.

  • Uma chamada para IEnumerable.GetEnumerator faz uma consulta ser criada com um adaptador de saída que fornecerá valores para a origem externa. GetEnumerator poderá gerar uma exceção quando uma das seguintes condições for verdadeira:

    • O servidor não é inserido.

    • A consulta não pode ser criada.

    • A consulta não pode ser iniciada (por exemplo, devido à falta de adaptadores).

  • Uma chamada para IEnumerator.Dispose faz a consulta ser interrompida e excluída. A implementação garante que depois que a chamada para Dispose retornar, não será feita nenhuma chamada para os métodos IEnumerator. Dispose poderá gerar uma exceção quando uma das seguintes condições for verdadeira:

    • A consulta não pode ser interrompida.

    • A consulta não pode ser excluída.

  • Uma chamada para o método Current poderá gerar uma exceção se MoveNext não tiver sido chamado pelo menos uma vez.

  • Uma chamada para MoveNext:

    • Não gera nenhuma exceção.

    • Retorna verdadeiro contanto que haja dados para fornecer.

    • Retorna falso quando a consulta tiver parado ou tiver sido anulada.

    • Bloqueia enquanto nenhum dado de saída estiver disponível para ser fornecido.