我有一个场景,一旦完成另一个订阅就开始订阅。两者都共享相同的连接流。
IConnectableObservable<List<int>> stream = GetMyHotStream();
var firstSubscription = stream.Subscribe(s=>{});
var secondSubscription = stream.Subscribe(s=> {});
stream.Connect();
现在我想等secondSubscription
直到firstSubscription
完成。
为简洁起见,我省略了其他细节。
任何答案都会非常有用..谢谢
答案 0 :(得分:0)
据我所知,你正在尝试保证两个订阅执行的顺序。问题是,在设置时,它们是独立的。我认为最好的解决方案就是将它们放在一个操作中。
stream.Subscribe(s =>
{
FirstSubscriptionStuff(s);
SecondSubscriptionStuff(s):
});
答案 1 :(得分:0)
这是一个示例,其中第一个订阅在每次对热观察者进行更新时打印出“Sub 1 item”。我使用Take(5)来确保第一个订阅完成。 然后,第二个订阅将继续从原始来源获取项目。
var s = Observable.Interval(TimeSpan.FromSeconds(1)).Publish();
var sub1 = s.Take(5).Dump("Sub 1 item");
var sub2 = sub1.IgnoreElements().Concat(s).Dump("Sub 2 item");
s.Connect();
输出:
Sub 1 item →0
Sub 1 item →1
Sub 1 item →2
Sub 1 item →3
Sub 1 item →4
Sub 2 item →5
Sub 2 item →6
Sub 2 item →7
这是你追求的那种吗? 的问候,
霍华德
答案 2 :(得分:-1)
我写了类似
的内容public static IObservable<TSource> WaitUntil<TSource>(this IObservable<TSource> source, IObservable<Unit> completionSource)
{
return new WaitUntil<TSource>(source, completionSource);
}
并通过订阅完成源的OnCompletion中的源来实现WaitUntil。
使用它是
var asyncSubject = new AsyncSubject();
var secondStream = stream.WaitUntil(asyncSubject).Subscribe(s =>
{
});
var firstStream = stream.SubscribeOn(Scheduler.NewThread).Subscribe(s =>
{ },
() =>
{
asyncSubject.OnCompleted();
});
stream.Connect();
var secondStream = stream.WaitUntil(asyncSubject).Subscribe(s =>
{
});
var firstStream = stream.SubscribeOn(Scheduler.NewThread).Subscribe(s =>
{ },
() =>
{
asyncSubject.OnCompleted();
});
stream.Connect();
不确定这是多么优雅,因为我刚开始在我的项目中使用Rx,但这很好。