لماذا تتفاعل الاشتراكات مع بعضها البعض؟
-
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();
تلقى كل مشترك قيمته الخاصة.
لا تنتمي إلى StackOverflow