我想:
IObservable<T>
,但立即开始缓冲收到的任何T
(即IObserver<T>
尚未看到的内容)。IObserver<T>
并继续订阅是第一件事,这一点非常重要。
在“大理石图”形式中,我追求的是......
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>
s1
和IObservable<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
答案 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);
});