سؤال

لقد قرأت عن النمط غير المتزامن القائم على المهام ويبدو رائعًا. الآن ، لدي خدمة WCF تحتاج إلى استدعاء خدمات WCF الأخرى. هذه الخدمات تعود نتيجة الاختلاف. كيف يمكن لـ ASYNC أن تسمي تلك الخدمات بالنمط الجديد وانتظار إكمال الجميع؟

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

المحلول

تحرير: إذا كنت قد حصلت للتو هذا السؤال لكيفية تحويل هؤلاء إلى Task<T> المهام - و ومن بعد سوف يكون بقية إجابتي قابلة للتطبيق.

في الأساس ، تحتاج TaskFactory<T>.FromAsync(...).


يمكنك استخدام TaskEx.WhenAll, والتي ستكون في النهاية Task.WhenAll.

لاحظ أن هذا سينتظر الكل المهام للانتهاء ، حتى لو كان هناك خطأ مبكرًا.

نظرًا لأن المهام لها أنواع نتائج مختلفة ، ستحتاج إلى إعدادها للبدء بها ، وانتظرها جميعًا للانتهاء ، ثم الاستيلاء على النتائج:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

await TaskEx.WhenAll(t1, t2, t3);

var result1 = t1.Result;
var result2 = t2.Result;
var result3 = t3.Result;

// Use the results

بدلاً من ذلك ، ما عليك سوى إطلاق النار على المهام لتبدأ ، وانتظر كل واحدة بشكل منفصل. لاحظ أن المهام الموجودة في TAP هي "ساخنة" - فهي تبدأ بمجرد إنشائها ، وليس عندما تنتظرها. لذلك سيعمل هذا أيضًا - لكن هذه المرة إذا t1 يلقي استثناء ، هو متعود أنتظر لأجل t2 و t3 لإكمال:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

var result1 = await t1;
var result2 = await t2;
var result3 = await t3;

// Use the results

لقد قمت بالتدوين حول هذا ، أولاً عن في انتظار مهام متعددة بشكل عام ثم حول استثناءات عند انتظار مهام متعددة.

نصائح أخرى

إذا كنت تريد أن تعرف عن خطط فريق WCF لدعم نموذج ASYNC/انتظار ، فقم بإلقاء نظرة على منشور المدونة التالي:

http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-with-async-await.aspx

أماديو

نرى Async CTP - كيف يمكنني استخدام Async/Achint للاتصال بخدمة WCF؟
للحصول على أمثلة على العملاء والخدمات ASYNC. او استعمل Asyncwcflib, ، يدعم نموذج البرمجة القائم على الممثل ولديه أمثلة على الخدمات التي تطلق الخدمات الأخرى داخل التطبيق أو عبر الشبكة.

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