Reputation: 1598
From the docs for the TakeUntil
operator (emphasis mine):
The TakeUntil subscribes and begins mirroring the source Observable. It also monitors a second Observable that you provide. If this second Observable emits an item or sends a termination notification, the Observable returned by TakeUntil stops mirroring the source Observable and terminates.
If this is true, then why does this block?:
Observable.Never<Unit>()
.TakeUntil(Observable.Empty<Unit>())
.Wait();
Upvotes: 5
Views: 1424
Reputation: 3488
Preston Guillot is on point in the comments section:
The (old) MSDN Documentation is different than the main Rx site's, and only states that
TakeUntil
"Returns the values from the source observable sequence until the other observable sequence produces a value." without considering terminated observables.
Let's take a look at the source code for Observable.TakeUntil
, specifically class O
which represents the "terminator" Observable
. We can see that parent.OnCompleted
notification is sent on O.OnNext
and O.OnError
.
So the reason why your code is blocking, is that Observable.Empty
(which acts as the "terminator") emits only an OnCompleted
notification.
Upvotes: 2