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.