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();
    }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top