سؤال

قررت مؤخرًا العمل مع 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 ، تحتاج إلى البقاء تفاعليًا على طول الطريق أو عليك حظره في مكان ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top