【问题标题】:How to create an observable that produces a single value and never completes如何创建一个产生单个值并且永远不会完成的可观察对象
【发布时间】:2016-11-09 04:09:17
【问题描述】:

我知道Observable.Never() 是一种创建永远不会完成的序列的方法,但是是否有一个扩展/清理过程来创建一个产生单个值然后永远不会完成的可观察对象?我会选择Observable.Create(...) 吗? Observable.Concat(Observable.Return(onlyValue), Observable.Never<T>())?还是有什么内置的或比这更“RXy”的东西?

【问题讨论】:

  • 您的 Concat 方法对我来说听起来不错 - 如果您需要在多个地方使用它,您可以随时将其包装在您自己的方法中。 (这听起来对我来说是一个相对罕见的场景,所以我不会特别期待内置方法。)
  • @JonSkeet 感谢您的反馈。一如既往的感激。
  • 对永不结束的可观察对象要小心。有人可能会创建一个查询,其中包含永远不会被释放的资源,从而导致内存泄漏。

标签: c# sequence system.reactive observable


【解决方案1】:

对于您的具体问题,一个简单的选择是使用 ‛Never‛ 和 ‛StartWith‛:

Observable.Never<int>().StartWith(5)

但是对于“我有一个可观察的序列会产生一些结果并最终完成并且我想更改它以使其无法完成”的更一般情况(您的问题是一个特例),您的 Concat 想法是这样做的方法

source.Concat(Observable.Never<int>());

Observable.Concat(source, Observable.Never<int>());

【讨论】:

    【解决方案2】:

    Observable.Concat(Observable.Return(onlyValue), Observable.Never&lt;T&gt;()) 似乎是正确的。反正我可能想多了。

    【讨论】:

    • 你也可以Observable.Never&lt;int&gt;().StartWith(5)
    • @Brandon 随时留下一个完整的答案,因为这正是我所希望的那种替代方案。另外,我讨厌接受我自己的答案……不知何故感觉很脏。 :D
    • 如果有可能存在“内置”的东西,这并不是想太多
    【解决方案3】:

    这可以做到更简单的使用:

    Observable.Return(whatever);
    

    【讨论】:

    • 这将发送whatever 然后立即完成,这并不是我想要的。不过,感谢您的考虑!
    • 这个已经不存在了。如果现在of(...) 一定是这样?
    • 正是我想要的
    【解决方案4】:

    这是一个通用的实用方法,可以一次性完成。 StartWith 的一个版本,可以在没有源序列的情况下调用,从而无需 Never。如果您经常使用该构造,可能会使您的代码更具可读性。

    public partial class ObservableEx
    {
        public static IObservable<TValue> StartWith<TValue>(TValue value)
        {
            return Observable.Create<TValue>(o =>
            {
                o.OnNext(value);
                return Disposable.Empty;
            });
        }
    }
    

    【讨论】:

      【解决方案5】:

      为了完整起见,这里是创建版本:

      Observable.Create<int>(subj => {
          // Anyone who subscribes immediately gets a constant value
          subj.OnNext(4);
      
          // We don't have to clean anything up on Unsubscribe
          // or dispose a source subscription
          return Disposable.Empty;
      });
      

      【讨论】:

      • 我将 subj 重命名为 obo 以反映它是一个观察者而不是一个主题。
      猜你喜欢
      • 2021-12-14
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2019-04-23
      相关资源
      最近更新 更多