我正在尝试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();
}
最佳答案 这种特殊行为的原因是观察结果很冷.这意味着每个订阅者都在.GetNext()上使用ReadKey调用.一旦我通过电话“预热”了观察者
var keypresses = KeyPresses().ToObservable().Publish();
每个订户都收到了自己的价值.