[英]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] 的正确理解是什么,是否有很好的示例用法?
Observable.Never()
和Observable.Empty()
observable 都不会发出任何值。 但是,使用Observable.Never()
构建的 observable 不会完成,而是保持“打开/活动”状态。 如果 observable 完成( Empty()
)或不完成( Never()
),在您使用这些 observable 的位置可能会有所不同,但这取决于您的实际用例。
拥有不发出任何值的 observable 听起来可能毫无用处,但也许您正处于必须提供 observable 的位置(而不是使用null
)。 所以你可以这样写:
public override IObservable<string> NameChanged => Observable.Never<string>();
所以我对 Rx 没有太多的经验,但我相信Subscribe
所做的就是注册当 observable 发出时要做什么。 如果您的 observable 永远不会发出(即Empty
或Never
),则永远不会调用该方法。 应用程序不会等待订阅本身结束。 如果你想永远等待,你会使用类似的东西
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);
}
运行时,应用程序将在将值推送到 observable 后立即写入“完成”并退出,因为它不知道订阅者是否已完成其处理。 希望我说清楚了,如果有更多 Rx 知识的人想在需要时介入以提供帮助,那就太好了。
此链接给你空的,从来没有,也扔的区别: http://reactivex.io/documentation/operators/empty-never-throw.html这是从来没有的一个用法: HTTPS://rxjs-dev.firebaseapp .com/api/index/const/从不
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.