Почему метод TakeLast <T>() не работает на ReplaySubject <T> - PullRequest
1 голос
/ 20 июля 2011

Согласно документации MSDN, следующий код должен выводить «5» в окно консоли. Вместо этого ничего не отображается.

static void Main(string[] args)
{
     var o = new ReplaySubject<int>();

     o.OnNext(0);
     o.OnNext(1);
     o.OnNext(2);
     o.OnNext(3);
     o.OnNext(4);
     o.OnNext(5);

     o.TakeLast(1).Subscribe(Console.WriteLine);

     Console.WriteLine("Press any key to exit");
     Console.ReadKey();
}

Ожидаемый результат:

5
Press any key to exit

Фактический объем производства:

Press any key to exit

Может кто-нибудь объяснить, почему это так?

1 Ответ

5 голосов
/ 20 июля 2011

Это потому, что вы никогда не уведомляете о завершении последовательности, поэтому TakeLast не знает, что последовательность завершена, и продолжает ждать конца последовательности.Это работает как ожидалось:

var o = new ReplaySubject<int>();

o.OnNext(0);
o.OnNext(1);
o.OnNext(2);
o.OnNext(3);
o.OnNext(4);
o.OnNext(5);
o.OnCompleted();

o.TakeLast(1).Subscribe(Console.WriteLine);
...