代码之家  ›  专栏  ›  技术社区  ›  Sergey Aldoukhov

为什么订阅会相互影响?

  •  4
  • Sergey Aldoukhov  · 技术社区  · 14 年前

    我正在试验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();
        }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Sergey Aldoukhov    14 年前

    这种特殊行为的原因是 寒冷的 .这意味着每个订阅服务器都在使用对.getNext()的readkey调用。一旦我通过电话“预热”可观察到的

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

    每个订阅服务器都收到自己的值。