Por que as assinaturas interagem entre si?
-
22-09-2019 - |
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();
}
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.