Task.Continue与RX相当

时间:2013-05-31 06:44:44

标签: system.reactive

我有一个场景,一旦完成另一个订阅就开始订阅。两者都共享相同的连接流。

IConnectableObservable<List<int>> stream = GetMyHotStream();
var firstSubscription = stream.Subscribe(s=>{});
var secondSubscription = stream.Subscribe(s=> {});
stream.Connect();

现在我想等secondSubscription直到firstSubscription完成。

为简洁起见,我省略了其他细节。

任何答案都会非常有用..谢谢

3 个答案:

答案 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,但这很好。