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

각 구독자가 자체적으로 값을 받았습니다.

관련 문제