【问题标题】:Why subscriptions interact with each other?为什么订阅会相互影响?
【发布时间】:2010-01-24 05:35:58
【问题描述】:

我正在尝试使用 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();
    }

【问题讨论】:

    标签: c# system.reactive


    【解决方案1】:

    这种特殊行为的原因是 observable 冷。这意味着每个订阅者都在使用 .GetNext() 上的 ReadKey 调用。一旦我通过调用“热身”观察到

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

    每个订阅者都收到了自己的价值。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2016-08-07
      相关资源
      最近更新 更多