与 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。

    • 在没有可提供的输出数据时阻止该调用。