¿Por qué suscripciones interactúan entre sí?
-
22-09-2019 - |
Pregunta
estoy experimentando con RX, y correr a través del siguiente problema (al menos yo lo percibo como un problema). El siguiente código crea un observable, y se adhiere a ella dos veces. Pensé suscripciones deben actuar con independencia , por lo que el código de abajo emitiría dos líneas, una para cada suscripción, en cada pulsación de tecla. Pero este no es el caso, siempre me dan una sola suscripción a manejar un golpe de tecla en particular, semi-aleatoriamente primero o segundo. ¿Por qué esto está ocurriendo y lo que es el camino "recomendada" para hacer múltiples observadores?
static IEnumerable<ConsoleKeyInfo> KeyPresses()
{
for (; ; )
{
var currentKey = Console.ReadKey(true);
if (currentKey.Key == ConsoleKey.Enter)
yield break;
yield return currentKey;
}
}
static void Main()
{
var timeToStop = new ManualResetEvent(false);
var keypresses = KeyPresses().ToObservable();
keypresses.Subscribe(key => Console.WriteLine(key.Key + "1"),
() => timeToStop.Set());
keypresses.Subscribe(key => Console.WriteLine(key.Key + "2"),
() => timeToStop.Set());
timeToStop.WaitOne();
}
Solución
La razón de este comportamiento particular era que el observables era frío . Significado cada abonado estaba consumiendo la llamada ReadKey en .GetNext (). Tan pronto como "calentado" lo observable llamando
var keypresses = KeyPresses().ToObservable().Publish();
cada abonado recibido su propio valor.