Почему подписки взаимодействуют друг с другом? - PullRequest
4 голосов
/ 24 января 2010

Я экспериментирую с 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();
    }

1 Ответ

2 голосов
/ 24 января 2010

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

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

каждый подписчик получил свое значение.

...