Perché abbonamenti interagiscono tra loro?
-
22-09-2019 - |
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();
}
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.