2010-01-24 15 views
4

J'expérimente RX et je rencontre le problème suivant (au moins, je le perçois comme un problème). Le code suivant crée un observable et s'y abonne deux fois. Je pensais abonnements devraient agir indépendamment, de sorte que le code ci-dessous produirait deux lignes, une pour chaque abonnement, sur chaque touche de presse. Mais ce n'est pas le cas, je reçois toujours un seul abonnement pour gérer un coup de clé particulier, semi-aléatoire en premier ou en second. Pourquoi cela se passe-t-il et quelle est la manière "recommandée" de faire plusieurs observateurs?Pourquoi les abonnements interagissent les uns avec les autres?

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(); 
    } 

Répondre

2

La raison de ce comportement particulier est que l'observable était froid. Cela signifiait 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.