2010-01-24 93 views
4

我正在尝试使用RX,并运行以下问题(至少我认为它是一个问题)。下面的代码创建一个observable,并为它订阅两次。我认为订阅应独立行动,因此下面的代码会在每次按键时输出两行,每个订阅一行。但事实并非如此,我总是只能得到一个订阅来处理特定的关键笔划,半随机的第一个或第二个。为什么会发生这种情况,以及“推荐”的方式来做多个观察者?订阅为什么互相交互?

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

回答

2

这样做的原因特定行为是可观察到的是。意味着每个用户正在使用.GetNext()上的ReadKey调用。当我通过调用

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

“回暖”可观察到的每个用户接受了它自身的价值。