Frage

ich mit RX am Experimentieren und über das folgende Problem laufen (zumindest ich sehe es als ein Problem). Der folgende Code erstellt eine beobachtbare und abonniert hat es zweimal. Ich dachte, Abonnements sollten unabhängig handeln , so dass der Code unten ausgegeben würde zwei Linien, eine für jedes Abonnement, auf jeder Taste drücken. Aber das ist nicht der Fall, hat sich immer nur ein Abonnement einen bestimmten Tastenhub, halbzufällig ersten oder zweiten zu handhaben. Warum dies geschieht und was ist die „empfehlenswert“ Art und Weise mehr Beobachter zu tun?

    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();
    }
War es hilfreich?

Lösung

Der Grund für dieses besondere Verhalten war, dass die beobachtbaren war kalt . jeder Teilnehmer Bedeutung war die ReadKey Anruf auf .GetNext () verbrauchen. Sobald ich „aufgewärmt“ die beobachtbare durch den Aufruf

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

jeder Teilnehmer erhielt einen eigenen Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top