Question

Je suis expérimenté avec RX, et courir à travers le problème suivant (au moins je le perçois comme un problème). Le code suivant crée une observable, et est abonnée à deux fois. Je pensais que abonnements doivent agir de manière indépendante , de sorte que le code ci-dessous génèrerait deux lignes, une pour chaque abonnement, sur chaque pression de touche. Mais ce n'est pas le cas, je reçois toujours un seul abonnement pour gérer une course clé particulière, semi-aléatoire première ou seconde. Pourquoi cela se passe et ce qui est « recommandé » façon de faire plusieurs observateurs?

    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();
    }
Était-ce utile?

La solution

La raison de ce comportement particulier est que l'observable était froid . Qui signifie que chaque abonné consommait l'appel ReadKey sur .GetNext (). Dès que je « échauffé » l'observable en appelant

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

chaque abonné a reçu sa propre valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top