如何通过某些逻辑传递项目?

时间:2016-12-17 07:12:25

标签: c# reactive-programming rx.net

我正在寻找一种通过某些逻辑来传递项目的方法。最明显的答案可能是使用。选择哪种情况适用于大多数情况,但我有一个特殊情况,问题实际上可以改为如何在所有订阅者使用一个项目后调用某个方法?

我正在考虑一个类似于PassThrough(this IObservable<TSource> obj, Action<TSource, IObserver<TResult>> selector)的扩展程序,我将以下列方式使用它

.PassThrough((source, observer) => {
   if(source != null) {
      using(var result = new Result(source)) {
         observer.OnNext(result);
      }
   }
});

最重要的部分是在将对象传递给OnNext后,在订阅者使用它之后调用.Dispose作为结果对象。我没有找到这种扩展方法。有人可以举例说明如何使用现有的Rx.NET API实现它,或者如何创建一个扩展来实现这一点,假设它是可能的?

1 个答案:

答案 0 :(得分:0)

您正在寻找的可能是Observable.Create通过扩展方法。在您的情况下,它可能如下所示:

public static IObservable<Result> PassThrough(this IObservable<TSource> obj, T source) {
   return Observable.Create(observer => {
      if(source != null) {
         using(var result = new Result(source)) {
            observer.OnNext(result);
            observer.OnCompleted();
         }
      } else {
         observer.OnError(Some Error);
         ...
      }
   })
}

显然,根据您是否要保持流的继续,您将省略OnCompleted()调用。

有关Observable.Create用法的更多信息,请参见此处: http://introtorx.com/Content/v1.0.10621.0/04_CreatingObservableSequences.html#CreationOfObservables