Да, наблюдатель может слушать несколько наблюдаемых.Лучшим примером для этого будет оператор Merge
.Все встроенные операторы будут следовать грамматике RX и часто применяют ее в источниках, которые этого не делают.
IObserver
, полученный из Observer.Create
, является одним из таких случаев.Он будет игнорировать любые будущие вызовы OnNext после вызова OnError или OnCompleted.Это означает, что использование одного и того же наблюдателя для подписки на одну наблюдаемую и затем на другую наблюдаемую после первой не будет работать, потому что сообщение о завершении из первой наблюдаемой заставит наблюдателя игнорировать сообщения от второй наблюдаемой.Чтобы обойти это, операторы типа Merge
, Concat
и OnErrorResumeNext
(среди прочих) используют несколько наблюдателей внутренне и не передают сообщения о завершении (OnError и / или OnCompleted в зависимости от семантики оператора) из любого, кромепоследняя наблюдаемая для внешнего наблюдателя.
Вы не упомянули, какое исключение вы получаете, но я предполагаю, что это ошибка, возникающая из-за тайм-аута, который вы получаете из observable4
.Если вы не предоставите другую наблюдаемую для использования в течение тайм-аута, вызывается OnError
наблюдателя, и по умолчанию OnError
для перегрузок Subscribe
и Observer.Create
, которые не принимают обработчик ошибок, - простоисключение.
Хотя это явно пример / тестирующий код, я хочу отметить, что даже если вы больше не получаете сообщения, передаваемые в OnNext
, все другие наблюдаемые продолжают работать после этого исключения.Либо используйте Merge
, чтобы отследить это для вас, либо отследить все расходные материалы из описания и утилизировать их самостоятельно, когда появится сообщение о завершении.CompositeDisposable
(в System.Reactive.Disposables
) хорошо для этого.