Información adicional sobre las interfaces IObservable e IEnumerable en StreamInsight
Este tema contiene información adicional que le ayudará a comprender la compatibilidad con orígenes y receptores de eventos observables y enumerables en StreamInsight.
Compatibilidad con las interfaces IObservable e IObserver en StreamInsight
Información general de las interfaces IObservable e IObserver
La interfaz IObservable proporciona el método siguiente:
Método |
Descripción |
---|---|
Subscribe |
Crea y devuelve una suscripción que implementa la interfaz IObserver. |
La interfaz IObserver proporciona los métodos siguientes:
Método |
Descripción |
---|---|
OnNext |
Notifica al observador la existencia de un nuevo valor en la secuencia. |
OnError |
Notifica al observador que se ha producido una excepción y que ha terminado la secuencia. No pueden producirse llamadas a OnNext, OnCompleted u OnError después de esta llamada. |
OnCompleted |
Notifica al observador el final de la secuencia. No pueden producirse llamadas a OnNext, OnCompleted u OnError después de esta llamada. |
Dispose |
Elimina la suscripción. |
Entrada desde un origen del evento de IObservable
Cuando se inicia una consulta que está enlazada a una entrada observable, StreamInsight llama al método IObservable.Subscribe del origen del evento, se crea una suscripción y el origen del evento empieza a proporcionar datos. La entrada puede notificar la terminación normal de su origen de datos si llama a IObserver.OnCompleted. O bien, el usuario puede detener la entrada si elimina la suscripción.
Excepciones y control de excepciones
Cuando la consulta de StreamInsight usa una entrada observable, no se llama a los métodos de las interfaces IObservable o IObserver en el código que se escribe; StreamInsight llama automáticamente a los métodos apropiados. Sin embargo, la información siguiente le ayudará a comprender cuándo pueden producirse excepciones y cómo se controlan.
El adaptador de entrada mantiene una referencia al origen del evento observable que proporciona eventos.
Si una llamada a IObservable.Subscribe produce una excepción, esta se propagará al runtime de StreamInsight y la consulta se anulará.
Si una llamada a IObserver.Dispose provoca una excepción, esta se registrará y omitirá.
Una llamada a IObserver.OnCompleted hace que el adaptador de entrada señale que se ha detenido. Las llamadas a los métodos de IObserver posteriores a esta llamada se tratan como errores y pueden producir excepciones.
Las excepciones producidas en las llamadas a IObserver.OnNext originan la anulación de la consulta y la eliminación de la suscripción. Las llamadas a los métodos de IObserver posteriores a esta llamada se tratan como errores y pueden producir excepciones. Una excepción en una llamada a OnNext se puede producir mediante:
Un evento NULL.
Una infracción de CTI.
Una excepción producida en una expresión de selector.
Una llamada a IObserver.OnNext se bloquea cuando el flujo del adaptador de entrada está completo y no se pueden poner en cola eventos.
Una llamada a IObserver OnError produce la anulación de la consulta. Las llamadas a los métodos de IObserver posteriores a esta llamada se tratan como errores y pueden producir excepciones.
Salida a un receptor de eventos de IObservable
Cuando el observador crea una suscripción mediante una llamada al método Subscribe de una salida de IObservable, se crea e inicia una instancia de una consulta, y la salida transitoria empieza a proporcionar datos. Existe una instancia de consulta para cada suscripción y solo existe mientras existe el consumidor. StreamInsight puede notificar la terminación normal de una consulta llamando a IObserver.OnCompleted. O bien, el usuario puede detener y eliminar implícitamente la consulta si elimina la suscripción. A la inversa, una consulta transitoria no se elimina hasta que no se elimina la suscripción correspondiente.
Excepciones y control de excepciones
Cuando se usa la salida de una consulta de StreamInsight a través de las interfaces IObservable e IObserver, el código que se escribe en el consumidor llama directamente a los métodos de estas interfaces. La información siguiente le ayudará a comprender cuándo pueden producirse excepciones y cómo se controlan.
Cuando un flujo se convierte en una salida de IObservable, esta instancia observable mantiene una referencia al flujo original. Tras ello, los observadores pueden suscribirse para recibir datos.
Una llamada a IObservable.Subscribe produce la creación y el inicio de una consulta, así como el comienzo de suministro de eventos al observador. Subscribe puede producir una excepción cuando se cumple alguna de las condiciones siguientes:
El servidor no es un servidor incrustado.
No se puede crear la consulta.
No se puede iniciar la consulta.
Una llamada a IObserver.Dispose produce la detención y posterior eliminación de la consulta. La implementación garantiza que las siguientes aseveraciones son ciertas:
Después de que la llamada a Dispose devuelva resultados, no se realizarán llamadas posteriores a métodos de IObserver.
La consulta subyacente se detendrá y se eliminará lo antes posible, pero no necesariamente antes de que la llamada a Dispose devuelva resultados.
Una llamada a Dispose desde un método de IObserver no producirá un interbloqueo.
Se llama a IObserver.OnError cuando la consulta se anula. La implementación proporciona una excepción que contiene al menos información de texto acerca del error. Después de una llamada a OnError, no se realizarán llamadas posteriores a métodos de IObserver. Se puede llamar a OnError cuando se cumple alguna de las condiciones siguientes:
Un adaptador produce una excepción.
Un operador produce una excepción.
Se llama a IObserver.OnCompleted cuando la consulta ha finalizado el procesamiento de la salida. Después de una llamada a OnCompleted, no se realizarán llamadas posteriores a métodos de IObserver. Se puede llamar a OnCompleted cuando se cumple alguna de las condiciones siguientes:
El adaptador de salida recibe un CTI de más infinito.
La consulta se suspende porque se han usado todos los eventos.
Si las llamadas de StreamInsight en métodos de IObserver (que son llamadas realizadas en el código del usuario) producen una excepción, la consulta se anulará. Si la consulta ya estaba en proceso de anulación, esta excepción se omitirá.
Si una expresión de selector produce una excepción, la consulta se anulará.
Compatibilidad con la interfaz IEnumerable en StreamInsight
Información general de la interfaz IEnumerable
La interfaz IEnumerable proporciona el método siguiente:
Método |
Descripción |
---|---|
GetEnumerator |
Crea y devuelve un enumerador que implementa la interfaz IEnumerator. |
La interfaz IEnumerator proporciona los métodos siguientes:
Método |
Descripción |
---|---|
Current |
Obtiene el elemento actual. |
MoveNext |
Adelanta el enumerador al siguiente elemento. |
Reset |
Establece el enumerador en su posición inicial, que es anterior al primer elemento. No pueden producirse llamadas a otros métodos de IEnumerator después de esta llamada. |
Dispose |
Elimina el enumerador. |
Entrada desde un origen del evento de IEnumerable
Cuando se inicia una consulta que está enlazada a una entrada transitoria, StreamInsight llama al método IEnumerable.GetEnumerator del origen del evento y obtiene un enumerador. A continuación, el origen del evento empieza a proporcionar datos mediante la llamad a IEnumerator.MoveNext e IEnumerator.Current en un bucle, mientras el flujo de entrada no esté vacío. La entrada puede notificar la terminación normal de sus datos de origen mediante la devolución de false cuando StreamInsight llama a MoveNext. O bien, el usuario puede detener la entrada si elimina el enumerador.
Excepciones y control de excepciones
Cuando la consulta de StreamInsight usa una entrada enumerable, no se llama a los métodos de las interfaces IEnumerable o IEnumerator en el código que se escribe; StreamInsight llama automáticamente a los métodos apropiados. Sin embargo, la información siguiente le ayudará a comprender cuándo pueden producirse excepciones y cómo se controlan.
El adaptador de entrada mantiene una referencia al origen del evento enumerable del que se extraerán eventos. El adaptador de entrada llama al origen del evento en su propio subproceso para obtener datos.
Si una llamada a IEnumerable.GetEnumerator, IEnumerator.Current, IEnumerator.MoveNext o IEnumerator.Dispose produce una excepción, la consulta se anulará.
Si una expresión de selector produce una excepción, la consulta se anulará.
Salida a un receptor de eventos de IEnumerable
Cuando el consumidor obtiene un enumerador mediante la llamada al método GetEnumerator de una salida de IEnumerable, se crea e inicia una instancia de una consulta, y la salida transitoria empieza a proporcionar datos. Existe una instancia de consulta para cada enumerador y solo existe mientras existe el consumidor. StreamInsight puede notificar la terminación normal de una consulta si devuelve false cuando el consumidor llama a IEnumerator.MoveNext. O bien, el usuario puede detener y eliminar implícitamente la consulta si elimina el enumerador. A la inversa, una consulta transitoria no se elimina hasta que no se elimina el enumerador correspondiente.
Excepciones y control de excepciones
Cuando se usa la salida de una consulta de StreamInsight a través de las interfaces IEnumerable e IEnumerator, el código que se escribe en el consumidor llama directamente a los métodos de estas interfaces. La información siguiente le ayudará a comprender cuándo pueden producirse excepciones y cómo se controlan.
Cuando un flujo se convierte en una salida de IEnumerable, esta instancia enumerable mantiene una referencia al flujo original. Los consumidores llaman a los métodos de IEnumerable e IEnumerator para extraer datos.
Una llamada a IEnumerable.GetEnumerator produce la creación de una consulta con un adaptador de consulta que proporcionará valores al origen externo. GetEnumerator puede producir una excepción cuando se cumple alguna de las condiciones siguientes:
El servidor no es un servidor incrustado.
No se puede crear la consulta.
No se puede iniciar la consulta (por ejemplo, debido a que faltan adaptadores).
Una llamada a IEnumerator.Dispose produce la detención y posterior eliminación de la consulta. La implementación garantiza que después de que la llamada a Dispose devuelva resultados, no se realizarán llamadas posteriores a métodos de IEnumerator. Dispose puede producir una excepción cuando se cumple alguna de las condiciones siguientes:
No se puede detener la consulta.
No se puede eliminar la consulta.
Una llamada al método Current puede producir una excepción si no se ha llamado a MoveNext por lo menos una vez.
Una llamada a MoveNext:
No produce excepciones.
Devuelve true mientras haya datos que se puedan proporcionar.
Devuelve false cuando la consulta se ha detenido o anulado.
Se bloquea mientras no haya datos de salida disponibles que se puedan proporcionar.