Это довольно крендель:
Observable.Using
похоже на оператор C # using
: он располагает IDisposable
после завершения наблюдения.
Observable.Defer
задерживает запуск включенного кода до подписки подписчика.
SubscribeOn
указывает, на какой поток должен быть подписан наблюдаемый объект на основе переданного в IScheduler
.
Я проверил следующее, которое также взрывает:
static void Main(string[] args)
{
Observable.Using(() => new EventLoopScheduler(), els =>
Observable.Empty<int>()
.SubscribeOn(els)
)
.Subscribe();
}
... поэтому Defer
не оказывает влияния.
Очевидно, Using
утилизирует планировщик перед его использованием. Если вы измените Observable.Empty
(или Observable.Return
) на что-то, что не завершится немедленно (например, Observable.Never
или Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(2)
), оно не будет разбомблено.
Похоже на ошибку состояния гонки в EventLoopScheduler
: Вероятно, и Observable.Using
, и EventLoopScheduler
пытаются вызвать Dispose
, и, если туда попадет неправильный, взорвать.
Я бы порекомендовал сбросить Using
.