StreamInsight 中 IObservable 和 IObserver 介面的詳細資訊

 

本主題所包含的詳細資訊可協助您了解 StreamInsight 對於可觀察和可列舉事件來源與接收的支援。

StreamInsight 對於 IObservable 和 IObserver 介面的支援

IObservable 和 IObserver 介面的概觀

IObservable 介面會提供下列方法:

方法 說明
Subscribe 建立並傳回實作 IObserver 介面的訂閱。

IObserver 介面會提供下列方法:

方法 說明
OnNext 通知 Observer 序列中有新的值。
OnError 通知 Observer 例外狀況已發生且序列已終止。

 OnNextOnCompletedOnError 的呼叫都不得接在此呼叫後面。
OnCompleted 通知 Observer 序列已結束。

 OnNextOnCompletedOnError 的呼叫都不得接在此呼叫後面。
Dispose 處置訂閱。

IObservable 事件來源的輸入

當您啟動繫結至可觀察輸入的查詢時,StreamInsight 就會呼叫事件來源的 IObservable.Subscribe 方法、建立訂閱,然後事件來源便開始提供資料。 此輸入可以透過呼叫 IObserver.OnCompleted,回報其來源資料的正常終止。 或者,使用者也可以透過處置訂閱,停止輸入。

例外狀況和例外狀況處理

當您的 StreamInsight 查詢取用可觀察的輸入時,您不會在所撰寫的程式碼中呼叫 IObservableIObserver 介面的方法。StreamInsight 會為您呼叫適當的方法。 不過,下列資訊可協助您了解可能發生例外狀況的時間以及例外狀況的處理方式。

輸入配接器會維護提供事件之可觀察事件來源的參考。

  • 如果 IObservable.Subscribe 的呼叫引發例外狀況,此例外狀況將傳播至 StreamInsight 執行階段,而且查詢將中止。

  • 如果 IObserver.Dispose 的呼叫引發例外狀況,系統將記錄並忽略此例外狀況。

  • IObserver.OnCompleted 的呼叫會導致輸入配接器發出它已停止的信號。 接在此呼叫後面之任何 IObserver 方法的呼叫都會被視為錯誤,而且可能會擲回例外狀況。

  • 針對 IObserver.OnNext 之呼叫所發生的例外狀況會導致系統中止查詢並且處置訂閱。 接在此呼叫後面之任何 IObserver 方法的呼叫都會被視為錯誤,而且可能會擲回例外狀況。 呼叫 OnNext 時發生的例外狀況可能是由下列原因造成:

    • Null 事件。

    • CTI 違規。

    • 選取器運算式擲回的例外狀況。

  • 當輸入配接器的資料流已滿,而且沒有任何事件可加入佇列時,IObserver.OnNext 的呼叫就會封鎖。

  • IObserver OnError 的呼叫會導致查詢中止。 接在此呼叫後面之任何 IObserver 方法的呼叫都會被視為錯誤,而且可能會擲回例外狀況。

IObservable 事件接收的輸出

當觀察器呼叫 IObservable 輸出的 Subscribe 方法來建立訂閱時,系統就會建立並啟動查詢的執行個體,而且暫時性輸出會開始提供資料。 每個訂閱都存在查詢執行個體,而且只有在取用者存在時才會存在。 StreamInsight 可以透過呼叫 IObserver.OnCompleted,回報查詢的正常終止。 或者,使用者也可以透過處置訂閱,停止並隱含地刪除查詢。 相反地,暫時性查詢要等到系統處置對應的訂閱之後才會刪除。

例外狀況和例外狀況處理

當您透過 IObservableIObserver 介面取用 StreamInsight 查詢的輸出時,您在取用者中撰寫的程式碼就會直接呼叫這些介面的方法。 下列資訊可協助您了解可能發生例外狀況的時間以及例外狀況的處理方式。

當某個資料流轉換成 IObservable 輸出時,這個可觀察的執行個體就會維護原始資料流的參考。 之後,觀察器可訂閱以接收資料。

  • IObservable.Subscribe 的呼叫會導致系統建立並啟動查詢,並且開始提供事件給觀察器。 當下列任何一個條件成立時,Subscribe 可能會引發例外狀況:

    • 伺服器不是內嵌伺服器。

    • 無法建立查詢。

    • 無法啟動查詢。

  • IObserver.Dispose 的呼叫會導致查詢停止,然後遭刪除。 此實作可確保下列陳述式成立:

    • Dispose 的呼叫傳回之後,不會進行其他 IObserver 方法的呼叫。

    • 系統將盡快停止並刪除基礎查詢,但不一定是在 Dispose 的呼叫傳回之前。

    • IObserver 方法呼叫 Dispose 不會導致死結。

  • 在查詢中止時呼叫 IObserver.OnError。 此實作會提供例外狀況,其中至少包含有關失敗的文字資訊。 在 OnError 的呼叫之後,不會進行其他 IObserver 方法的呼叫。 當下列任何一個條件成立時,可能會呼叫 OnError

    • 配接器引發例外狀況。

    • 運算子引發例外狀況。

  • 在查詢已經完成輸出的處理時呼叫 IObserver.OnCompleted。 在 OnCompleted 的呼叫之後,不會進行其他 IObserver 方法的呼叫。 當下列任何一個條件成立時,可能會呼叫 OnCompleted

    • 輸出配接器接收正無限的 CTI。

    • 由於所有事件都已經被取用而暫停查詢。

  • 如果 StreamInsight 呼叫 IObserver 方法 (在使用者程式碼中呼叫) 時引發例外狀況,此例外狀況將導致查詢中止。 如果查詢已經在進行中止,系統將忽略此例外狀況。

  • 如果選取器運算式引發例外狀況,此例外狀況將導致查詢中止。

StreamInsight 對於 IEnumerable 介面的支援

IEnumerable 介面的概觀

IEnumerable 介面會提供下列方法:

方法 說明
GetEnumerator 建立並傳回實作 IEnumerator 介面的列舉值。

IEnumerator 介面會提供下列方法:

方法 說明
Current 取得目前的元素。
MoveNext 將列舉值前移到下一個元素。
Reset 將列舉值設定為其初始位置,在第一個元素之前。

其他 IEnumerator 方法的呼叫都不得接在此呼叫後面。
Dispose 處置列舉值。

IEnumerable 事件來源的輸入

當您啟動繫結至暫時性輸入的查詢時,StreamInsight 就會呼叫事件來源的 IEnumerable.GetEnumerator 方法,並且取得列舉值。 然後,只要輸入資料流不是空白的,事件來源就會在迴圈中呼叫 IEnumerator.MoveNextIEnumerator.Current,藉以開始提供資料。 當 StreamInsight 呼叫 MoveNext 時,此輸入可以透過傳回 false,回報其來源資料的正常終止。 或者,使用者也可以透過處置列舉值,停止輸入。

例外狀況和例外狀況處理

當您的 StreamInsight 查詢取用可列舉的輸入時,您不會在所撰寫的程式碼中呼叫 IEnumerableIEnumerator 介面的方法。StreamInsight 會為您呼叫適當的方法。 不過,下列資訊可協助您了解可能發生例外狀況的時間以及例外狀況的處理方式。

輸入配接器會維護從中提取事件之可列舉事件來源的參考。 輸入配接器會在它本身的執行緒中呼叫事件來源,以便取得資料。

  • 如果 IEnumerable.GetEnumeratorIEnumerator.CurrentIEnumerator.MoveNextIEnumerator.Dispose 的呼叫引發例外狀況,此例外狀況將導致查詢中止。

  • 如果選取器運算式引發例外狀況,此例外狀況將導致查詢中止。

IEnumerable 事件接收的輸出

當取用者呼叫 IEnumerable 輸出的 GetEnumerator 方法來取得列舉值時,系統就會建立並啟動查詢的執行個體,而且暫時性輸出會開始提供資料。 每個列舉值都存在查詢執行個體,而且只有在取用者存在時才會存在。 當取用者呼叫 IEnumerator.MoveNext 時,StreamInsight 可以透過傳回 false,回報查詢的正常終止。 或者,使用者也可以透過處置列舉值,停止並隱含地刪除查詢。 相反地,暫時性查詢要等到系統處置對應的列舉值之後才會刪除。

例外狀況和例外狀況處理

當您透過 IEnumerableIEnumerator 介面取用 StreamInsight 查詢的輸出時,您在取用者中撰寫的程式碼就會直接呼叫這些介面的方法。 下列資訊可協助您了解可能發生例外狀況的時間以及例外狀況的處理方式。

當某個資料流轉換成 IEnumerable 輸出時,這個可列舉的執行個體就會維護原始資料流的參考。 取用者會呼叫 IEnumerableIEnumerator 的方法來提取資料。

  • IEnumerable.GetEnumerator 的呼叫會導致系統使用提供值給外部來源的輸出配接器來建立查詢。 當下列任何一個條件成立時,GetEnumerator 可能會引發例外狀況:

    • 伺服器不是內嵌伺服器。

    • 無法建立查詢。

    • 無法啟動查詢 (例如,由於配接器遺失)。

  • IEnumerator.Dispose 的呼叫會導致查詢停止,然後遭刪除。 此實作可確保在 Dispose 的呼叫傳回之後,不會進行其他 IEnumerator 方法的呼叫。 當下列任何一個條件成立時,Dispose 可能會引發例外狀況:

    • 無法停止查詢。

    • 無法刪除查詢。

  • 如果尚未呼叫 MoveNext 至少一次,Current 方法的呼叫可能會引發例外狀況:

  • MoveNext 的呼叫:

    • 不會引發任何例外狀況。

    • 只要存在可提供的資料,就會傳回 true。

    • 當查詢已經停止或中止時,就會傳回 false。

    • 當沒有任何輸出資料可提供時,則封鎖。