C# 从阵列在接收中创建热可观测
我该怎么做 我有一个代码可以:C# 从阵列在接收中创建热可观测,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我该怎么做 我有一个代码可以: new int[]{1,2,3}.ToObservable().Subscribe(myObserver); 问题是,第一次调用是冷可观察的,因此在另一次调用中,像这样: new int[]{4,5,6}.ToObservable().Subscribe(myObserver); new int[] { 1, 2, 3, } .ToObservable() .Concat(Observable.Never<int>()) .
new int[]{1,2,3}.ToObservable().Subscribe(myObserver);
问题是,第一次调用是冷可观察的,因此在另一次调用中,像这样:
new int[]{4,5,6}.ToObservable().Subscribe(myObserver);
new int[] { 1, 2, 3, }
.ToObservable()
.Concat(Observable.Never<int>())
.Subscribe(myObserver);
new int[] { 4, 5, 6, }
.ToObservable()
.Concat(Observable.Never<int>())
.Subscribe(myObserver);
myObserver根本不会触发onNext。显然是因为第一次调用发布了
1,2,3,END
。我不想让可观察对象调用“END”,因为我想以后继续订阅。有没有一个函数可以轻松地为我做到这一点?在不知道这些观察值在上下文中如何使用的情况下,我的第一个建议是在订阅之前将两个观察值(或IEnumerable
s)浓缩
(new int[]{1,2,3}.ToObservable())
.Concat(new int[]{4,5,6}.ToObservable())
.Subscribe(myObserver)
据我所知,没有一种方法可以在代码中的
ToObservable
和Subscribe
调用之间插入,以获得所需的行为。可以编写这样的方法,但它不能很好地与库的其余部分配合使用。您需要执行以下操作:
new int[]{4,5,6}.ToObservable().Subscribe(myObserver);
new int[] { 1, 2, 3, }
.ToObservable()
.Concat(Observable.Never<int>())
.Subscribe(myObserver);
new int[] { 4, 5, 6, }
.ToObservable()
.Concat(Observable.Never<int>())
.Subscribe(myObserver);
newint[]{1,2,3,}
.TooObservable()文件
.Concat(可观察到的.Never())
.订阅(myObserver);
新int[]{4,5,6,}
.TooObservable()文件
.Concat(可观察到的.Never())
.订阅(myObserver);
关键是对Observable执行
.Concat(observatable.Never())
,以防止它永远结束。Fwiw,要将冷的Observable变为热的Observable,请使用多播:
var obs = new[] {1,2,3}.ToObservable()
.Multicast(new Subject<int>())
// TODO: Subscribe as many people as you want
obs.Connect(); // Everyone subscribed gets 1,2,3,Completed now
obs.Subscribe(...); // This guy gets no results
var obs=new[]{1,2,3}.ToObservable()
.Multicast(新主题())
//TODO:订阅任意数量的用户
obs.Connect();//每个人都订阅了1,2,3,现在完成
obs.Subscribe(…);//这家伙没有结果
哦,顺便说一句,你所要求的不是一个“热”的可观察到的。你的问题标题有点误导人。顺便说一句,BTQ是对BTW的拼写错误。;-)非常感谢。“那应该可以了。”阿尔温-不用担心。只是一个快速警告-您需要确保正确处理所有异常,因为它们也将结束任何可观察到的异常。如果你需要过滤掉异常(这通常是一个坏主意),那么看看.Materialize()
&.Dematerialize()
。如果用户实际获取数组,然后将其转换为可观察序列,可能不必担心错误:)Gideon,这不是我正在研究的选项。我不能同时使用这两个列表,事实上它们在代码的两个独立区域中,我不想将它们结合在一起。