Domanda

sto sperimentando con RX, e corro attraverso il seguente problema (almeno io percepisco come un problema). Il codice seguente crea un osservabile, e sottoscrive due volte. Ho pensato abbonamenti agiscano in modo indipendente , quindi nel codice sotto uscita due linee, una per ogni abbonamento, di ciascun tasto. Ma questo non è il caso, ottengo sempre solo un abbonamento per gestire un particolare tratto chiave, semi-casuale prima o seconda. Perché questo sta accadendo e qual è il modo "raccomandato" per fare più osservatori?

    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();
    }
È stato utile?

Soluzione

La ragione di questo particolare comportamento era che il osservabile era freddo . Significato ogni abbonato stava consumando la chiamata ReadKey su .GetNext (). Appena ho "scaldato" il osservabile chiamando

var keypresses = KeyPresses().ToObservable().Publish(); 

ogni abbonato ha ricevuto il proprio valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top