Почему подписки взаимодействуют друг с другом?

StackOverflow https://stackoverflow.com/questions/2126095

  •  22-09-2019
  •  | 
  •  

Вопрос

Я экспериментирую с 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();
    }
Это было полезно?

Решение

Причина этого конкретного поведения заключалась в том, что наблюдаемое было холодный.Это означает, что каждый подписчик выполнял вызов ReadKey для .GetNext().Как только я "разогрел" наблюдаемое, вызвав

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

каждый подписчик получил свою собственную ценность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top