【问题标题】:C# Rx Observable.Never<> behaves like Observable.Empty<>?C# Rx Observable.Never<> 的行为类似于 Observable.Empty<>?
【发布时间】:2020-03-07 06:35:55
【问题描述】:

我是 Rx 的新手,可以试试这个代码 sn-p。

Observable.Never<string>().Subscribe(Console.Write);
Observable.Empty<string>().Subscribe(Console.Write);

我预计 Never&lt;string&gt;() 的行为会像 Console.ReadKey 一样不会结束,但是当我运行这两行时,它们会立即结束,所以 [Never] 对我来说就像 [Empty]。

什么是[Never]的正确理解,有没有很好的示例用法?

【问题讨论】:

  • 所有订阅“代码行”立即结束,您只需提供一个在每个“OnNext”上调用的回调作为Subscribe 的参数。 NeverEmpty 都不会发出任何 OnNext。但是,Empty 会立即发出 OnCompleted。 (您不提供任何回调)

标签: c# observable system.reactive subscribe


【解决方案1】:

Observable.Never()Observable.Empty() observable 都不会发出任何值。但是,使用Observable.Never() 构建的 observable 将不会完成,而是保持“打开/活动”状态。如果 observable 完成 (Empty()) 或未完成 (Never()),您使用这些 observable 的位置可能会有所不同,但这取决于您的实际用例。

拥有不发出任何值的 observables 可能听起来毫无用处,但也许您处于必须提供 observable 的位置(而不是使用 null)。所以你可以这样写:

public override IObservable<string> NameChanged => Observable.Never<string>();

【讨论】:

    【解决方案2】:

    所以我在 Rx 方面没有大量经验,但我相信 Subscribe 所做的只是注册可观察对象发出时要做什么。如果您的 observable 永远不会发出(即EmptyNever),则永远不会调用该方法。应用程序不等待订阅本身结束。如果你想永远等待,你会使用类似

    Observable.Never<string>().Wait();
    

    这与您不应在 Subscribe 中使用异步操作的原因有关。取以下代码

    static void Main(string[] args)
    {
      Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
      Console.WriteLine("done");
    }
    
    static async Task DoTheThing(int x)
    {
      await Task.Delay(TimeSpan.FromSeconds(x));
      Console.WriteLine(x);
    }
    

    在运行时,应用程序将立即写入“完成”并在将值推送到可观察对象后退出,因为它在上下文中不知道订阅者是否已完成处理。希望我说清楚了,如果有更多 Rx 知识的人想要在需要时提供帮助,那就太好了。

    【讨论】:

      【解决方案3】:

      此链接告诉您 emptyneverthrow 之间的区别: http://reactivex.io/documentation/operators/empty-never-throw.html 这是 Never 的一种用法: https://rxjs-dev.firebaseapp.com/api/index/const/NEVER

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        相关资源
        最近更新 更多