为什么订阅互相交互?

时间:2010-01-24 05:35:59

标签: c# system.reactive

我正在尝试使用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 个答案:

答案 0 :(得分:2)

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

“预热”了观察者
var keypresses = KeyPresses().ToObservable().Publish(); 

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