c# - 订阅多个可观察对象的观察者未完成

标签 c# system.reactive

我正在尝试了解 RX,并正在为创建的观察者订阅两个不同的观察者。

var observer = Observer.Create<string>(x => Console.WriteLine(x), 
            () => Console.WriteLine("Completed"));

var subscription1 = Observable.Interval(TimeSpan.FromSeconds(1))
            .Select(x => "X" + x)
            .Subscribe(observer);

var subscription2 = Observable.Interval(TimeSpan.FromSeconds(2))
           .Select(x => "YY" + x)
           .Subscribe(observer);

Console.WriteLine("Unsubscribing in 5 seconds");
Thread.Sleep(5000);
subscription1.Dispose();
subscription2.Dispose();

Console.WriteLine("All disposed");

我希望在处理 subscription1 之后,观察者将完成。我在这里错过了什么?目前我从上面的代码中得到以下控制台输出:

Unsubscribing in 5 seconds
X0
YY0
X1
X2
YY1
X3
All disposed

最佳答案

Observable.Interval 创建一个无限序列,因此您永远不会收到“已完成”消息。通过取消订阅,您就可以停止收听这个无限序列。

如果您希望序列完成,您可以使用类似Observable.Interval(...).Take(3) 的东西。

关于c# - 订阅多个可观察对象的观察者未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603815/

相关文章:

c# - 调用的对象已与其客户端断开连接 (WatIn)

c# - 即使找到键, Entity Framework 也会为导航属性插入行

c# - 为什么 double.TryParse ("0.0000", out doubleValue) 返回 false ?

c# - 使用Rx和Await来完成逐行异步读取文件的异常

c# - 将 IEnumerable<Task<T>> 转换为 IObservable<T>

c# - IObservable .Cast<>() 和协方差

c# - 在运行时以编程方式获取摘要注释

c# - 如何阻塞直到 RX 流中发生事件?

java - Observable 中的 subcribeOn() io.reactivex.Scheduler 不能应用于 rx.Scheduler

c# - Unity 中的 DontDestroyOnLoad() 和稍后场景中的引用(使用 C#)