يمكن ملاحظته.
-
29-09-2019 - |
سؤال
قررت مؤخرًا العمل مع RX (الامتدادات التفاعلية) لنظام التشغيل Windows Phone 7 وواجهت بعض السلوك الغريب.
على سبيل المثال ، لديّ قطعة من الكود:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://whatismyip.org/");
request.Method = "GET";
var x = from c in Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)()
select c;
WebResponse r = x.First();
Debug.WriteLine(r.ContentType.ToString());
ما أحاول اكتشافه هو السبب في أن أصل إلى استعلام LINQ ، فإنه يعلق واجهة المستخدم ولا يذهب إلى أبعد من ذلك. أيه أفكار؟
المحلول
AFAIK ، اتصل بـ First هو الحظر ، لذلك سيتم استئناف التنفيذ فقط بعد تلقي الاستجابة. حاول استبداله بـ
x.Take(1).Subscribe(r => Debug.WriteLine(r.ContentType.ToString()));
نصائح أخرى
سأرمي شيئًا أكثر أهمية في هذا السيناريو. كما لوحظ بالفعل ، صحيح أن أولاً هو مكالمة حظر. لمعالجة التعليق بأن الاستجابة لم يتم استلامها أبدًا عند استخدام First () ، من المهم أن ندرك في Silverlight أن مؤشر ترابط واجهة المستخدم (المرسل) يستخدم فعليًا عند استلام بيانات الشبكة. لذلك باستخدام أولاً ، يمكنك منع سلسلة واجهة المستخدم من استلام استجابة سلسلة واجهة المستخدم التي ينتظرها. في Silverlight ، من الأهمية بمكان عدم منع سلسلة واجهة المستخدم لأي سبب.
Desco صحيح حول First()
حظر. في RX ، تحتاج إلى البقاء تفاعليًا على طول الطريق أو عليك حظره في مكان ما.