如果作为事件源的可观察对象在完成时被调用,它实际上比你想象的要简单OnCompleted()。这将自行解决问题:
observable.Sample(TimeSpan.FromMilliseconds(100)).Subscribe(log);
这是因为Sample当它的事件源完成时会最后一次触发。这是一个完整的测试:
var sub = new Subject<string>();
var gen = Observable.Interval(TimeSpan.FromMilliseconds(50)).Select((_,i) => i).Subscribe(i => sub.OnNext(i.ToString()));
sub.Sample(TimeSpan.FromSeconds(1))
.Subscribe(Console.WriteLine);
Thread.Sleep(3500);
sub.OnCompleted();
即使我睡了 3.5 秒,也会触发 4 个事件,最后一个在我调用时触发OnCompleted()。
另一点需要注意的是,如果Worker.GetObservable()实际返回 a是不好的形式Subject<string>- 即使它是在 Worker 类中,它真正应该做的只是返回IObservable<string>接口。这不仅仅是风格,它是关注点的分离并返回所需的最小功能接口。