Subject.HasObservers не является истинным в примере кода, прикрепленного к неопределенному количеству тиков.Если я уберу SubscribeOn (), HasObservers всегда будет true, поэтому я знаю, что это связано с инициализацией IScheduler.
Это вызывало проблему в нашем производственном программном обеспечении, когда первые несколько вызовов OnNext () ни к чему не привели, несмотря на гарантию, что переменная подписки IDisposable была инициализирована до того, как потоку, вызвавшему OnNext (), было разрешено продолжить,Это ошибка в RX?
Каковы другие способы использования классов System.Reactive, чтобы гарантировать настройку подписки с планировщиком без опроса?
Я пробовал Subject.Synchronize (),но это не имело значения.
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
var source = new Subject<long>();
IDisposable subscription = source
.SubscribeOn(ThreadPoolScheduler.Instance)
.Subscribe(Console.WriteLine);
// 0 and 668,000 ticks for subscription setup, but rarely 0.
int iterations = 0;
while (!source.HasObservers)
{
iterations++;
Thread.SpinWait(1);
}
// Next line would rarely output to Console without while loop
source.OnNext(iterations);
subscription.Dispose();
source.Dispose();
}
}
Я ожидал, что Subject.HasObservers будет истинным без опроса.