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 从不发出(即 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);
}
当 运行 时,应用程序将立即写入 "done" 并在将值推送到可观察对象后退出,因为它不知道订阅者是否已完成处理。希望我说清楚了,如果有更多 Rx 知识的人愿意在需要时介入以提供帮助,那就太好了。
这个 link 告诉你 empty,never 和 throw[=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>();
我是 Rx 的新手,有这个代码片段可以试试。
Observable.Never<string>().Subscribe(Console.Write);
Observable.Empty<string>().Subscribe(Console.Write);
我预计 Never<string>()
会像 Console.ReadKey
那样不会结束,但是当我 运行 这两行时,它们会立即结束,所以 [Never] 表现得像 [Empty ]对我来说。
[Never] 的正确理解是什么?有没有好的示例用法?
所以我对 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);
}
当 运行 时,应用程序将立即写入 "done" 并在将值推送到可观察对象后退出,因为它不知道订阅者是否已完成处理。希望我说清楚了,如果有更多 Rx 知识的人愿意在需要时介入以提供帮助,那就太好了。
这个 link 告诉你 empty,never 和 throw[=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>();