与 StreamInsight 中的 IObservable 和 IEnumerable 接口有关的详细信息
本主题包含更多信息,有助您理解针对 StreamInsight 中的可观察和可枚举的事件源和接收器的支持。
针对 StreamInsight 中的 IObservable 和 IObserver 接口的支持
IObservable 和 IObserver 接口概述
IObservable 接口提供以下方法:
方法 |
说明 |
---|---|
Subscribe |
创建并返回实现 IObserver 接口的订阅。 |
IObserver 接口提供以下方法:
方法 |
说明 |
---|---|
OnNext |
向观察者通知序列中的新值。 |
OnError |
向观察者通知已发生异常且终止了序列。 不能在此调用后调用 OnNext、OnCompleted 或 OnError。 |
OnCompleted |
向观察者通知序列结束。 不能在此调用后调用 OnNext、OnCompleted 或 OnError。 |
Dispose |
释放订阅。 |
自 IObservable 事件源输入
启动绑定到可观察输入的查询时,StreamInsight 调用事件源的 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 方法创建订阅时,将创建并启动一个查询实例,同时暂时性输出开始提供数据。每个订阅都对应一个查询实例,而且查询实例仅在使用者存在时才存在。StreamInsight 可通过调用 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 事件源输入
在启动绑定到暂时性输入的查询时,StreamInsight 会调用事件源的 IEnumerable.GetEnumerator 方法并获取枚举器。然后,事件源通过循环调用 IEnumerator.MoveNext 和 IEnumerator.Current 开始提供数据(只要输入流不为空)。通过在 StreamInsight 调用 MoveNext 时返回 false,输入可报告其源数据的正常终止。或者,用户可以通过释放该枚举器来停止输入。
异常和异常处理
当您的 StreamInsight 查询使用可枚举的输入时,您不用调用自己编写的代码中的 IEnumerable 或 IEnumerator 接口的方法;StreamInsight 会为您调用适当的方法。但是,以下信息会帮助您理解何时会出现异常以及如何处理出现的异常。
输入适配器保留对可枚举的事件源(自其请求事件)的引用。输入适配器在自己的线程上调用事件源以获取数据。
如果调用 IEnumerable.GetEnumerator、IEnumerator.Current、IEnumerator.MoveNext 或 IEnumerator.Dispose 引发了异常,这将导致查询中止。
如果选择器表达式引发了异常,这将导致查询中止。
输出到 IEnumerable 事件接收器
当使用者通过调用 IEnumerable 输出的 GetEnumerator 方法获取枚举器时,将创建并启动一个查询实例,同时暂时性输出开始提供数据。每个枚举器都对应一个查询实例,而且查询实例仅在使用者存在时才存在。通过在使用者调用 IEnumerator.MoveNext 时返回 false,StreamInsight 可报告查询的正常终止。或者,用户可以通过释放枚举器来停止和隐式删除查询。反之,只有释放相应的枚举器后,才会删除暂时性查询。
异常和异常处理
通过 IEnumerable 和 IEnumerator 接口使用 StreamInsight 查询的输出时,您在使用者调用中编写的代码将直接调用这些接口的方法。以下信息将帮助您理解何时会出现异常以及如何处理出现的异常。
将流转换为 IEnumerable 输出后,这一可枚举的实例将保留对原始流的引用。使用者调用 IEnumerable 和 IEnumerator 的方法以请求数据。
调用 IEnumerable.GetEnumerator 可创建查询,并通过输出适配器向外部源提供值。GetEnumerator 可能在出现以下任何情况时引发异常:
服务器不是嵌入式服务器。
无法创建查询。
无法启动查询(例如,在缺少适配器的情况下)。
调用 IEnumerator.Dispose 将导致停止查询,随后删除该查询。实现该调用可确保在对 Dispose 的调用返回后,就不会再调用 IEnumerator 方法。Dispose 可能在出现以下任何情况时引发异常:
无法停止查询。
无法删除查询。
如果一次都未调用 MoveNext,调用 Current 方法将引发异常。
调用 MoveNext:
不会引发任何异常。
返回 true(只要有可提供的数据)。
在查询已停止或中止时返回 false。
在没有可提供的输出数据时阻止该调用。