C# 为什么订阅会相互影响?

C# 为什么订阅会相互影响?,c#,system.reactive,C#,System.reactive,我正在试验RX,遇到了以下问题(至少我认为这是一个问题)。下面的代码创建一个可观察对象,并订阅它两次。我认为订阅应该独立运行,所以下面的代码会在每次按键时输出两行,每个订阅一行。但事实并非如此,我总是只得到一个订阅来处理特定的按键笔划,半随机的第一次或第二次。为什么会发生这种情况?多个观察者的“推荐”方式是什么 static IEnumerable<ConsoleKeyInfo> KeyPresses() { for (; ; ) {

我正在试验RX,遇到了以下问题(至少我认为这是一个问题)。下面的代码创建一个可观察对象,并订阅它两次。我认为订阅应该独立运行,所以下面的代码会在每次按键时输出两行,每个订阅一行。但事实并非如此,我总是只得到一个订阅来处理特定的按键笔划,半随机的第一次或第二次。为什么会发生这种情况?多个观察者的“推荐”方式是什么

    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();
    }
静态IEnumerable按键()
{
对于(;;)
{
var currentKey=Console.ReadKey(true);
if(currentKey.Key==ConsoleKey.Enter)
屈服断裂;
产生返回键;
}
}
静态void Main()
{
var timeToStop=新手动重置事件(错误);
var keypresss=keypresss().ToObservable();
keypress.Subscribe(key=>Console.WriteLine(key.key+“1”),
()=>timeToStop.Set());
keypress.Subscribe(key=>Console.WriteLine(key.key+“2”),
()=>timeToStop.Set());
timeToStop.WaitOne();
}

这种特殊行为的原因是可观察到的物体是冷的。这意味着每个订户都在使用.GetNext()上的ReadKey调用。当我通过呼叫“预热”可观察对象时

var keypresses = KeyPresses().ToObservable().Publish(); 
每个订户都收到了自己的价值