Ulteriori informazioni sulle interfacce IObservable e IEnumerable in StreamInsight

In questo argomento sono incluse ulteriori informazioni utili per la comprensione del supporto per origini evento e sink di evento Observable ed enumerabili in StreamInsight.

Supporto per le interfacce IObservable e IObserver in StreamInsight

Panoramica delle interfacce IObservable e IObserver

L'interfaccia IObservable fornisce il metodo seguente:

Metodo

Descrizione

Subscribe

Crea e restituisce una sottoscrizione che implementa l'interfaccia IObserver.

L'interfaccia IObserver fornisce i metodi seguenti:

Metodo

Descrizione

OnNext

Notifica all'observer la presenza di un nuovo valore nella sequenza.

OnError

Notifica all'observer che si è verificata un'eccezione e che la sequenza è stata terminata.

Nessuna chiamata a OnNext, OnCompleted o OnError può seguire questa chiamata.

OnCompleted

Notifica all'observer la fine della sequenza.

Nessuna chiamata a OnNext, OnCompleted o OnError può seguire questa chiamata.

Dispose

Elimina la sottoscrizione.

Input da un'origine evento IObservable

Quando si avvia una query associata a un input Observable, StreamInsight chiama il metodo IObservable.Subscribe dell'origine evento, viene creata una sottoscrizione e l'origine evento inizia a fornire dati. L'input può segnalare la normale fine dei dati di origine chiamando IObserver.OnCompleted. In alternativa, l'utente può arrestare l'input eliminando la sottoscrizione.

Eccezioni e gestione delle eccezioni

Quando la query di StreamInsight utilizza un input Observable, non è necessario chiamare i metodi dell'interfaccia IObservable o IObserver nel codice scritto, in quanto StreamInsight chiama automaticamente i metodi appropriati. Le informazioni seguenti, tuttavia, consentono di identificare i casi in cui possono verificarsi eccezioni e il modo in cui queste vengono gestite.

L'adattatore di input mantiene un riferimento all'origine evento Observable che fornisce eventi.

  • Se una chiamata a IObservable.Subscribe genera un'eccezione, l'eccezione verrà propagata nel runtime di StreamInsight e la query verrà interrotta.

  • Se una chiamata a IObserver.Dispose genera un'eccezione, l'eccezione verrà registrata e ignorata.

  • Una chiamata a IObserver.OnCompleted fa sì che l'adattatore di input segnali il proprio arresto. Tutte le chiamate a metodi di IObserver successive a questa chiamata vengono considerate errori e potrebbero generare eccezioni.

  • Le eccezioni che si verificano nelle chiamate a IObserver.OnNext provocano l'interruzione della query e l'eliminazione della sottoscrizione. Tutte le chiamate a metodi di IObserver successive a questa chiamata vengono considerate errori e potrebbero generare eccezioni. Un'eccezione in una chiamata a OnNext può essere provocata da:

    • Un evento Null.

    • Una violazione CTI.

    • Un'eccezione generata da un'espressione selettore.

  • Una chiamata ai blocchi IObserver.OnNext mentre il flusso dell'adattatore di input è completo e non può essere accodato alcun evento.

  • Una chiamata a IObserver OnError provoca l'interruzione della query. Tutte le chiamate a metodi di IObserver successive a questa chiamata vengono considerate errori e potrebbero generare eccezioni.

Output a un sink di evento IObservable

Quando l'observer crea una sottoscrizione chiamando il metodo Subscribe di un output IObservable, viene creata e avviata un'istanza di una query e l'output temporaneo inizia a fornire dati. È presente un'istanza di query per ogni sottoscrizione e solo durante la presenza del consumer. StreamInsight può segnalare la normale fine di una query chiamando IObserver.OnCompleted. In alternativa, l'utente può arrestare ed eliminare in modo implicito la query eliminando la sottoscrizione. Al contrario, una query temporanea viene eliminata solo dopo l'eliminazione della sottoscrizione corrispondente.

Eccezioni e gestione delle eccezioni

Quando si utilizza l'output di una query di StreamInsight tramite le interfacce IObservable e IObserver, il codice scritto nel consumer chiama direttamente i metodi di tali interfacce. Le informazioni seguenti consentono di identificare i casi in cui possono verificarsi eccezioni e il modo in cui queste vengono gestite.

Quando un flusso viene convertito in output IObservable, questa istanza Observable mantiene un riferimento al flusso originale. Successivamente, gli observer possono eseguire la sottoscrizione per ricevere dati.

  • Una chiamata a IObservable.Subscribe fa sì che venga creata e avviata una query e che questa inizi a fornire eventi all'observer. Subscribe può generare un'eccezione quando si verifica una delle condizioni seguenti:

    • Il server non è un server incorporato.

    • Non è possibile creare la query.

    • Non è possibile avviare la query.

  • Una chiamata a IObserver.Dispose provoca l'arresto e quindi l'eliminazione della query. L'implementazione fa sì che si verifichi quanto segue:

    • In seguito alla restituzione della chiamata a Dispose, non verranno eseguite ulteriori chiamate ai metodi di IObserver.

    • La query sottostante verrà arrestata ed eliminata quanto prima possibile, ma non necessariamente prima che venga restituita la chiamata a Dispose.

    • Una chiamata a Dispose da un metodo di IObserver non provocherà un deadlock.

  • Viene chiamato IObserver.OnError quando viene interrotta la query. L'implementazione fornisce un'eccezione che contiene almeno informazioni testuali sull'errore. Dopo una chiamata a OnError, non verranno eseguite ulteriori chiamate ai metodi di IObserver. È possibile chiamare OnError quando si verifica una delle condizioni seguenti:

    • Un adattatore genera un'eccezione.

    • Un operatore genera un'eccezione.

  • Viene chiamato IObserver.OnCompleted quando la query completa l'elaborazione dell'output. Dopo una chiamata a OnCompleted, non verranno eseguite ulteriori chiamate ai metodi di IObserver. È possibile chiamare OnCompleted quando si verifica una delle condizioni seguenti:

    • L'adattatore di output riceve un CTI più infinito.

    • La query viene sospesa perché sono stati utilizzati tutti gli eventi.

  • Se le chiamate da parte di StreamInsight in metodi di IObserver, ovvero chiamate eseguite nel codice utente, generano un'eccezione, la query verrà interrotta. Se l'interruzione della query è già in corso, l'eccezione verrà ignorata.

  • Se un'espressione selettore genera un'eccezione, la query viene interrotta.

Supporto per l'interfaccia IEnumerable in StreamInsight

Panoramica dell'interfaccia IEnumerable

L'interfaccia IEnumerable fornisce il metodo seguente:

Metodo

Descrizione

GetEnumerator

Crea e restituisce un enumeratore che implementa l'interfaccia IEnumerator.

L'interfaccia IEnumerator fornisce i metodi seguenti:

Metodo

Descrizione

Current

Ottiene l'elemento corrente.

MoveNext

Passa l'enumeratore all'elemento successivo.

Reset

Imposta l'enumeratore sulla relativa posizione iniziale, che si trova prima del primo elemento.

Nessuna chiamata ad altri metodi di IEnumerator può seguire questa chiamata.

Dispose

Elimina l'enumeratore.

Input da un'origine evento IEnumerable

Quando si avvia una query associata a un input temporaneo, StreamInsight chiama il metodo IEnumerable.GetEnumerator dell'origine evento e ottiene un enumeratore. L'origine evento inizia quindi a fornire dati chiamando IEnumerator.MoveNext e IEnumerator.Current in un ciclo, fino a quando il flusso di input non è vuoto. L'input può segnalare la normale fine dei dati di origine restituendo false quando StreamInsight chiama MoveNext. In alternativa, l'utente può arrestare l'input eliminando l'enumeratore.

Eccezioni e gestione delle eccezioni

Quando la query di StreamInsight utilizza un input enumerabile, non è necessario chiamare i metodi dell'interfaccia IEnumerable o IEnumerator nel codice scritto, in quanto StreamInsight chiama automaticamente i metodi appropriati. Le informazioni seguenti, tuttavia, consentono di identificare i casi in cui possono verificarsi eccezioni e il modo in cui queste vengono gestite.

L'adattatore di input mantiene un riferimento a un'origine evento enumerabile da cui verrà effettuato il pull degli eventi. L'adattatore di input chiama nell'origine evento nel relativo thread per ottenere dati.

  • Se una chiamata a IEnumerable.GetEnumerator o a IEnumerator.Current, IEnumerator.MoveNext o IEnumerator.Dispose genera un'eccezione, la query viene interrotta.

  • Se un'espressione selettore genera un'eccezione, la query viene interrotta.

Output a un sink di evento IEnumerable

Quando il consumer ottiene un enumeratore chiamando il metodo GetEnumerator di un output IEnumerable, viene creata e avviata un'istanza di una query e l'output temporaneo inizia a fornire dati. È presente un'istanza di query per ogni enumeratore e solo durante la presenza del consumer. StreamInsight può segnalare la normale fine di una query restituendo false quando il consumer chiama IEnumerator.MoveNext. In alternativa, l'utente può arrestare ed eliminare in modo implicito la query eliminando l'enumeratore. Al contrario, una query temporanea viene eliminata solo dopo l'eliminazione dell'enumeratore corrispondente.

Eccezioni e gestione delle eccezioni

Quando si utilizza l'output di una query di StreamInsight tramite le interfacce IEnumerable e IEnumerator, il codice scritto nel consumer chiama direttamente i metodi di tali interfacce. Le informazioni seguenti consentono di identificare i casi in cui possono verificarsi eccezioni e il modo in cui queste vengono gestite.

Quando un flusso viene convertito in output IEnumerable, questa istanza enumerabile mantiene un riferimento al flusso originale. I consumer chiamano i metodi di IEnumerable e IEnumerator per effettuare il pull dei dati.

  • Una chiamata a IEnumerable.GetEnumerator provoca la creazione di una query con un adattatore di output che fornirà valori all'origine esterna. GetEnumerator può generare un'eccezione quando si verifica una delle condizioni seguenti:

    • Il server non è un server incorporato.

    • Non è possibile creare la query.

    • Non è possibile avviare la query, ad esempio a causa di adattatori mancanti.

  • Una chiamata a IEnumerator.Dispose provoca l'arresto e quindi l'eliminazione della query. L'implementazione garantisce che in seguito alla restituzione della chiamata a Dispose non verranno effettuate ulteriori chiamate a metodi di IEnumerator. Dispose può generare un'eccezione quando si verifica una delle condizioni seguenti:

    • Non è possibile arrestare la query.

    • Non è possibile eliminare la query.

  • Una chiamata al metodo Current può generare un'eccezione se MoveNext non è stato chiamato almeno una volta.

  • Una chiamata a MoveNext:

    • Non genera alcuna eccezione.

    • Restituisce true a condizione che vi siano dati da fornire.

    • Restituisce false quando la query è stata arrestata o interrotta.

    • Si blocca quando non sono disponibili dati di output da fornire.