いずれかのストリームが完了したときに終了するようにMergeを書き直す代わりに、onCompletedイベントをonNextイベントに変換し、var ss = s1.Merge(s2).TakeUntil(s1ors2complete)s1またはs2のいずれかが終了したときにs1ors2completeが値を生成する場所を使用することをお勧めします。.TakeUntil(s1completes).TakeUntil(s2completes)s1ors2completeを作成する代わりに、チェーンすることもできます。このアプローチは、MergeWithCompleteOnEither拡張機能よりも優れた構成を提供します。これは、「両方が完了したときに完了する」演算子を「完了したときに完了する」演算子に変更するために使用できるためです。
onNextイベントをonCompletedイベントに変換する方法については、いくつかの方法があります。CompositeDisposableメソッドは良いアプローチのように聞こえます。少し検索すると、onNext、onError、およびonCompleted通知間の変換に関するこの興味深いスレッドが見つかります。を使用してReturnTrueOnCompletedという拡張メソッドを作成するxs.SkipWhile(_ => true).concat(Observable.Return(True))と、マージは次のようになります。
var s1ors2complete = s1.ReturnTrueOnCompleted().Amb(s2.ReturnTrueOnCompleted());
var ss = s1.Merge(s2).TakeUntil(s1ors2complete).Finally(() => Console.WriteLine("Finished!"));
また、入力ストリームの1つが完了すると自動的に完了するZipなどの演算子を使用することもできます。