Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过具有特定逻辑的项目?_C#_Reactive Programming_Rx.net - Fatal编程技术网

C# 如何通过具有特定逻辑的项目?

C# 如何通过具有特定逻辑的项目?,c#,reactive-programming,rx.net,C#,Reactive Programming,Rx.net,我正在寻找一种方法来传递具有特定逻辑的项目。最明显的答案可能是使用。选择哪种方法对大多数情况都有效,但我有一个特殊情况,问题实际上可以重新表述为在所有订阅者都使用某个项目后如何调用某个方法 我在考虑这样一个扩展,它看起来像是PassThrough(这个IObservable obj,Action selector),我将按以下方式使用它 .PassThrough((source, observer) => { if(source != null) { using(var

我正在寻找一种方法来传递具有特定逻辑的项目。最明显的答案可能是使用。选择哪种方法对大多数情况都有效,但我有一个特殊情况,问题实际上可以重新表述为在所有订阅者都使用某个项目后如何调用某个方法

我在考虑这样一个扩展,它看起来像是
PassThrough(这个IObservable obj,Action selector)
,我将按以下方式使用它

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

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

您正在寻找的可能是可观察的。通过扩展方法创建。在您的情况下,它可能如下所示:

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);
         ...
      }
   })
}
公共静态IObservable PassThrough(此IObservable obj,T源){
返回可观察的。创建(观察者=>{
如果(源!=null){
使用(var结果=新结果(源)){
OnNext观察员(结果);
observer.OnCompleted();
}
}否则{
observer.OnError(某些错误);
...
}
})
}
显然,根据您是否希望继续流,您将省略OnCompleted()调用

有关Observable用法的更多信息,请参见此处。创建:

您要查找的内容可能是可见的。请通过扩展方法创建。在您的情况下,它可能如下所示:

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);
         ...
      }
   })
}
公共静态IObservable PassThrough(此IObservable obj,T源){
返回可观察的。创建(观察者=>{
如果(源!=null){
使用(var结果=新结果(源)){
OnNext观察员(结果);
observer.OnCompleted();
}
}否则{
observer.OnError(某些错误);
...
}
})
}
显然,根据您是否希望继续流,您将省略OnCompleted()调用

有关Observable用法的更多信息,请参见此处。创建:

我认为,dipose的问题在于,您不知道订阅者何时使用该对象。他们可能会为你所知道的一切进行缓冲,并分批消费。OnNext不保证在调用OnNext时处理项目。这一点很好,但如果项目在调用OnNext后以某种方式缓冲,则这可能是一种无法工作的情况。如果没有办法清楚地解决这种情况,让我们假设没有缓冲。在这种情况下,如何实现PassThrough扩展方法?我应该在里面用主语还是宾语?实现自定义扩展方法的一般指导原则是什么?我认为,dipose的问题是,您不知道订阅者何时使用该对象。他们可能会为你所知道的一切进行缓冲,并分批消费。OnNext不保证在调用OnNext时处理项目。这一点很好,但如果项目在调用OnNext后以某种方式缓冲,则这可能是一种无法工作的情况。如果没有办法清楚地解决这种情况,让我们假设没有缓冲。在这种情况下,如何实现PassThrough扩展方法?我应该在里面用主语还是宾语?实现自定义扩展方法的一般指导原则是什么?