2010-01-24 95 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(); 

「回暖」可觀察到的每個用戶接受了它自身的價值。