C# Rx Observable.Never<> 表现得像 Observable.Empty<>?

C# Rx Observable.Never<> behaves like Observable.Empty<>?

我是 Rx 的新手,有这个代码片段可以试试。

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

我预计 Never<string>() 会像 Console.ReadKey 那样不会结束,但是当我 运行 这两行时,它们会立即结束,所以 [Never] 表现得像 [Empty ]对我来说。

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

所以我对 Rx 没有太多经验,但我相信 Subscribe 所做的只是注册当 observable 发出时要做什么。如果您的 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);
}

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

这个 link 告诉你 empty,neverthrow[=18] 之间的区别=]: http://reactivex.io/documentation/operators/empty-never-throw.html 这是 Never 的一种用法: https://rxjs-dev.firebaseapp.com/api/index/const/NEVER

Observable.Never()Observable.Empty() observable 都不会发出任何值。但是,使用 Observable.Never() 构建的可观察对象不会完成,而是保持 "open/active"。如果 observable 完成(Empty())或不完成(Never()),您使用这些 observable 的位置可能会有所不同,但这取决于您的实际用例。

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

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