如何订阅,但缓冲来自Observable的数据,直到另一个Observable发布?

时间:2011-09-20 05:44:19

标签: c#-4.0 system.reactive

我想:

  1. 立即订阅IObservable<T>,但立即开始缓冲收到的任何T(即IObserver<T>尚未看到的内容)。
  2. 做一些工作。
  3. 工作完成后,将缓冲区刷新到我的IObserver<T>并继续
  4. 订阅是第一件事,这一点非常重要。

    在“大理石图”形式中,我追求的是......

    Time                  T+1   2   3   4   5   6   7   8
    s1:IObservable<int>     1   2   3   4   5   6   7   8  
    s2:IObservable<bool>          t    
    r: IObservable<int>           1 3   4   5   6   7   8
                                  2
    

    ...因为在T + 1,我订阅了IObservable<bool> r,它本身依赖于IObservable<int> s1IObservable<bool> {{1 }}。 s2是我无法控制的流,s1是我控制的流(主题),s2是在工作完成时。

    我认为publish可以帮助我,但这不会缓冲在依赖SkipUntil完成之前收到的事件。

    以下是我认为可以使用的一些代码,但不是因为IObservable不是缓冲区。

    SkipUntil

    我知道各种 var are = new AutoResetEvent(false); var events = Observable.Generate(1, i => i < 12, i => i + 1, i => i, i => TimeSpan.FromSeconds(1)); events.Subscribe(x => Console.WriteLine("events:" + x), () => are.Set()); var subject = new Subject<int>(); var completed = subject.AsObservable().Delay(TimeSpan.FromSeconds(5)); Console.WriteLine("Subscribing to events..."); events.SkipUntil(completed).Subscribe(x=> Console.WriteLine("events.SkipUntil(completed):"+ x)); Console.WriteLine("Subscribed."); completed.Subscribe(x => Console.WriteLine("Completed")); subject.OnNext(10); are.WaitOne(); Console.WriteLine("Done"); 方法,但在这种情况下它们似乎不合适,因为我在这里并没有真正缓冲,只是在订阅开始时协调活动。

    更新

    我已将Enigmativity的响应推广到以下可能有用的扩展方法中:

    Buffer

1 个答案:

答案 0 :(得分:4)

这对我有用:

var r = Observable.Create<int>(o =>
{
    var rs = new ReplaySubject<int>();
    var subscription1 = s1.Subscribe(rs);
    var query = from f in s2.Take(1) select rs.AsObservable();
    var subscription2 = query.Switch().Subscribe(o);
    return new CompositeDisposable(subscription1, subscription2);
});