Pergunta

Estou experimentando o RX e encontro o problema a seguir (pelo menos percebo como um problema). O código a seguir cria um observável e se inscreve duas vezes. Eu pensei As assinaturas devem agir de forma independente, para que o código abaixo produza duas linhas, uma para cada assinatura, em cada tecla Press. Mas esse não é o caso, eu sempre recebo apenas uma assinatura para lidar com um golpe de chave específico, semi-randomizado primeiro ou segundo. Por que isso está acontecendo e qual é a maneira "recomendada" de fazer vários observadores?

    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();
    }
Foi útil?

Solução

A razão para esse comportamento em particular era que o observável era resfriado. O que significa que cada assinante estava consumindo a chamada readkey no .getNext (). Assim que eu "aqueci" o observável ligando

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

Cada assinante recebeu seu próprio valor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top