Warum interagieren Abonnements miteinander?
-
22-09-2019 - |
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();
}
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.