StreamInsight の IObservable インターフェイスと IEnumerable インターフェイスの詳細情報
このトピックには、StreamInsight の監視可能なイベント ソース/シンクと列挙可能なイベント ソース/シンクのサポートの理解に役立つ詳細情報が含まれています。
StreamInsight の IObservable インターフェイスと IObserver インターフェイスのサポート
IObservable インターフェイスと IObserver インターフェイスの概要
IObservable インターフェイスには次のメソッドが用意されています。
メソッド |
説明 |
---|---|
Subscribe |
IObserver インターフェイスを実装するサブスクリプションを作成して返します。 |
IObserver インターフェイスには次のメソッドが用意されています。
メソッド |
説明 |
---|---|
OnNext |
オブザーバーにシーケンスの新しい値を通知します。 |
OnError |
例外が発生したためシーケンスが終了することをオブザーバーに通知します。 この呼び出しの後に OnNext、OnCompleted、または OnError を呼び出すことはできません。 |
OnCompleted |
オブザーバーにシーケンスの終点を通知します。 この呼び出しの後に OnNext、OnCompleted、または OnError を呼び出すことはできません。 |
Dispose |
サブスクリプションを破棄します。 |
IObservable イベント ソースからの入力
監視可能な入力にバインドされたクエリを開始すると、イベント ソースの IObservable.Subscribe メソッドが呼び出されてサブスクリプションが作成され、イベント ソースによるデータの提供が開始されます。入力は、IObserver.OnCompleted の呼び出しによってソース データの正常終了が報告されて終了する場合もあれば、ユーザーによるサブスクリプションの破棄によって停止される場合もあります。
例外と例外処理
StreamInsight クエリで監視可能な入力を使用する際には、記述するコードで IObservable インターフェイスや IObserver インターフェイスのメソッドを呼び出す必要はありません。StreamInsight によって適切なメソッドが呼び出されます。ただし、次の情報を把握しておくと、どのような場合に例外が発生し、どのように処理されるのかを理解するうえで役に立ちます。
入力アダプターでは、イベントを提供する監視可能なイベント ソースへの参照が維持されます。
IObservable.Subscribe の呼び出しで例外が発生すると、その例外が StreamInsight ランタイムに伝達されて、クエリが中止されます。
IObserver.Dispose の呼び出しで例外が発生すると、その例外はログに記録されて無視されます。
IObserver.OnCompleted が呼び出されると、入力アダプターの停止が通知され、その後の IObserver のメソッドの呼び出しはすべてエラーとして処理されます。例外がスローされる場合もあります。
IObserver.OnNext の呼び出しで例外が発生すると、クエリが中止されて、サブスクリプションが破棄されます。その後の IObserver のメソッドの呼び出しはすべてエラーとして処理されます。例外がスローされる場合もあります。OnNext の呼び出しで例外が発生する場合は、次のような原因が考えられます。
null イベント。
CTI 違反。
セレクター式からスローされた例外。
入力アダプターのストリームがいっぱいで、イベントをキューに登録できない間は、IObserver.OnNext の呼び出しがブロックされます。
IObserver OnError が呼び出されると、クエリが中止されます。その後の IObserver のメソッドの呼び出しはすべてエラーとして処理されます。例外がスローされる場合もあります。
IObservable イベント シンクへの出力
オブザーバーが IObservable 出力の Subscribe メソッドを呼び出してサブスクリプションを作成すると、クエリのインスタンスが作成されて開始され、一時出力によるデータの提供が開始されます。クエリ インスタンスはサブスクリプションごとに存在します。クエリ インスタンスが存在するのは、コンシューマーが存在する間だけです。クエリは、IObserver.OnCompleted の呼び出しによって正常終了が報告されて終了する場合もあれば、ユーザーによるサブスクリプションの破棄によって停止され、暗黙的に削除される場合もあります。逆に言うと、一時クエリは、対応するサブスクリプションが破棄されるまで削除されません。
例外と例外処理
IObservable インターフェイスと IObserver インターフェイスを使用して 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 イベント ソースからの入力
一時入力にバインドされたクエリを開始すると、イベント ソースの IEnumerable.GetEnumerator メソッドが呼び出されて列挙子が取得され、イベント ソースによるデータの提供が開始されます。入力ストリームが空になるまで、IEnumerator.MoveNext と IEnumerator.Current がループで呼び出されます。入力は、MoveNext の呼び出しに対して false を返すことにより、ソース データの正常終了が報告されて終了する場合もあれば、ユーザーによる列挙子の破棄によって停止される場合もあります。
例外と例外処理
StreamInsight クエリで列挙可能な入力を使用する際には、記述するコードで IEnumerable インターフェイスや IEnumerator インターフェイスのメソッドを呼び出す必要はありません。StreamInsight によって適切なメソッドが呼び出されます。ただし、次の情報を把握しておくと、どのような場合に例外が発生し、どのように処理されるのかを理解するうえで役に立ちます。
入力アダプターでは、イベントがプルされる元の列挙可能なイベント ソースへの参照が維持されます。入力アダプターは、自身のスレッドでイベント ソースを呼び出してデータを取得します。
IEnumerable.GetEnumerator、IEnumerator.Current、IEnumerator.MoveNext、または IEnumerator.Dispose の呼び出しで例外が発生すると、クエリが中止されます。
セレクター式で例外が発生すると、クエリが中止されます。
IEnumerable イベント シンクへの出力
コンシューマーが IEnumerable 出力の GetEnumerator メソッドを呼び出して列挙子を取得すると、クエリのインスタンスが作成されて開始され、一時出力によるデータの提供が開始されます。クエリ インスタンスは列挙子ごとに存在します。クエリ インスタンスが存在するのは、コンシューマーが存在する間だけです。クエリは、IEnumerator.MoveNext の呼び出しに対して false を返すことにより、正常終了が報告されて終了する場合もあれば、ユーザーによる列挙子の破棄によって停止され、暗黙的に削除される場合もあります。逆に言うと、一時クエリは、対応する列挙子が破棄されるまで削除されません。
例外と例外処理
IEnumerable インターフェイスと IEnumerator インターフェイスを使用して StreamInsight クエリの出力を使用する際には、コンシューマーで記述するコードでこれらのインターフェイスのメソッドを直接呼び出します。次の情報を把握しておくと、どのような場合に例外が発生し、どのように処理されるのかを理解するうえで役に立ちます。
ストリームが IEnumerable 出力に変換されると、この列挙可能なインスタンスで元のストリームへの参照が維持されます。コンシューマーは、IEnumerable と IEnumerator のメソッドを呼び出してデータをプルします。
IEnumerable.GetEnumerator が呼び出されると、外部ソースに値を提供する出力アダプターと共にクエリが作成されます。GetEnumerator では、次のいずれかの条件に当てはまる場合に例外が発生する可能性があります。
サーバーが埋め込みサーバーではない。
クエリを作成できない。
クエリを開始できない (アダプターが見つからない場合など)。
IEnumerator.Dispose が呼び出されると、クエリが停止されて削除されます。実装では、Dispose の呼び出しが戻ると、それ以上 IEnumerator のメソッドを呼び出すことができなくなります。Dispose では、次のいずれかの条件に当てはまる場合に例外が発生する可能性があります。
クエリを停止できない。
クエリを削除できない。
Current メソッドの呼び出しでは、MoveNext がまだ 1 回も呼び出されていないと例外が発生する可能性があります。
MoveNext の呼び出しには次のような特徴があります。
例外は発生しません。
提供するデータがある限り true を返します。
クエリが停止または中止されている場合は false を返します。
提供できる出力データがない間はブロックされます。