سؤال

أحاول تنزيل بعض البيانات من WCF باستخدام RX.لكن Observable.FromAsyncPattern() لا يُرجع أي استجابة عند الجمع بين الاستخدام SelecMany

لقد حاولت تسليط الضوء على هذه المشكلة في المقتطف أدناه:

var timer = Observable.Timer(TimeSpan.FromSeconds(1));
var obs = Observable.FromAsyncPattern<PictureFile>(ServiceClient.BeginDownloadFilePreview, ServiceClient.EndDownloadFilePreview);

obs().Subscribe(x => Debug.WriteLine("I am here"));

var result = from _ in timer
             from data in obs()
             select data;

result.Subscribe(x => Debug.WriteLine("Can't get here :( "));

حتى إذا فهم RX و SelecMany بشكل صحيح، يجب أن يطبع الكود أعلاه:

"أنا هنا"

"لا أستطيع الوصول إلى هنا :("

ومع ذلك فإنه يطبع السطر الأول فقط وليس الثاني

يحرر: نسيت أن أذكر أن هذا الرمز يعمل بشكل جيد دون إرفاق مصحح أخطاء، ولكنه يفشل إذا قمت بتشغيله دون مصحح أخطاء

هل كانت مفيدة؟

المحلول

وجدته للتو!

أولا لا ينبغي لي أن أفعل ذلك ابتلع الاستثناءات، على الرغم من أنها كانت عبارة عن رمز اختبار ويجب أن تقوم بتسجيل كافة الاستثناءات التي تم الإبلاغ عنها بواسطة IObservable.

ثانيًا، كنت أقوم بتشغيل مشروعي من اختبارات MSUnit، وعند تشغيله باستخدام مصحح الأخطاء المرفق، فقد أثر ذلك على maxReceivedMessageSize لربط WCF (على الأقل يبدو كذلك)، لذلك عندما كنت قيد التشغيل في وضع التصحيح، كان كل شيء يعمل، ولكن عند التشغيل بدونه فشل طلب واحد، لكنني لم أره لأنني لم أقم بتسجيل الوصول إلى رسائل OnError.

تعلمت الدرس:قم دائمًا بتسجيل رسائل OnError

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