لماذا تتفاعل الاشتراكات مع بعضها البعض؟

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