استدعاء الأساليب غير المتزامنة

في برمجة الحاسوب متعددة الخيوط ، يُعدّ استدعاء الأساليب غير المتزامن ( AMI )، المعروف أيضًا باسم استدعاءات الأساليب غير المتزامنة أو النمط غير المتزامن ، نمط تصميم لا يتم فيه حظر موقع الاستدعاء أثناء انتظار انتهاء تنفيذ الكود المُستدعى. بدلاً من ذلك، يتم إخطار الخيط المُستدعي عند وصول الرد. ويُعتبر التحقق من الرد خيارًا غير مرغوب فيه.

خلفية

نمط AMI هو نمط تصميم لاستدعاء غير متزامن لأساليب كائن ما التي قد تستغرق وقتًا طويلاً . [ 1 ] وهو مكافئ لنمط IOU ("أنا مدين لك") الذي وصفه آلان فيرمولين عام 1996. [ 2 ] [ 3 ]

في معظم لغات البرمجة، تُنفَّذ الدالة المُستدعاة بشكل متزامن، أي في سلسلة العمليات التي تُستدعى منها. إذا استغرقت الدالة وقتًا طويلاً لإكمالها، مثلاً بسبب تحميل البيانات عبر الإنترنت، فإن سلسلة العمليات المُستدعِية تُحظر حتى تنتهي الدالة. عندما لا يكون هذا مرغوبًا، يُمكن بدء "سلسلة عمليات عاملة" واستدعاء الدالة منها. في معظم بيئات البرمجة، يتطلب هذا عددًا كبيرًا من أسطر التعليمات البرمجية، خاصةً إذا تم الحرص على تجنب العبء الإضافي الذي قد ينتج عن إنشاء العديد من سلاسل العمليات. يحل AMI هذه المشكلة من خلال إضافة نسخة "غير متزامنة" من دالة الكائن التي قد تستغرق وقتًا طويلاً، والتي تُنهي عملها فورًا، إلى جانب دوال إضافية تُسهِّل تلقي إشعار بالاكتمال، أو انتظار الاكتمال في وقت لاحق.

يُستخدم نمط تصميم الكائنات النشطة (AF) بشكل شائع في تطبيقات AMI . ومن البدائل الأخرى استدعاء الأساليب المتزامنة وكائنات المستقبل . [ 4 ] ومن الأمثلة على التطبيقات التي قد تستخدم AMI متصفح الويب الذي يحتاج إلى عرض صفحة ويب حتى قبل تحميل جميع الصور.

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

التطبيقات

فئة جافا

تستخدم فئة FutureTask [ 5 ] في جافا الأحداث لحل المشكلة نفسها. هذا النمط هو شكل معدل من AMI، ويتطلب تنفيذه تكلفة إضافية، ولكنه مفيد للكائنات التي تمثل مكونات البرمجيات .

إطار عمل .NET

  • نمط نموذج البرمجة غير المتزامنة (APM) (المستخدم قبل .NET Framework 2.0) [ 6 ]
  • نمط غير متزامن قائم على الأحداث (EAP) (يستخدم في .NET Framework 2.0) [ 7 ]
  • نمط غير متزامن قائم على المهام (TAP) (يستخدم في .NET Framework 4.0) [ 8 ]

مثال

يستند المثال التالي بشكل فضفاض إلى نمط AMI القياسي المستخدم في إطار عمل .NET . [ 9 ] عند إعطاء دالة Accomplish، تتم إضافة دالتين جديدتين BeginAccomplishو EndAccomplish:

class Example { Result Accomplish ( args ) IAsyncResult BeginAccomplish ( args ) Result EndAccomplish ( IAsyncResult a ) }

عند استدعاء الدالة BeginAccomplish، يتلقى العميل فورًا كائنًا من النوع AsyncResult(الذي يُنفذ IAsyncResultالواجهة)، مما يسمح له بمتابعة سلسلة العمليات المُستدعِية بمهام أخرى. في أبسط الحالات، لا يتبقى أي عمل من هذا القبيل، فيستدعي العميل الدالة EndAccomplish(مع تمرير الكائن الذي استلمه سابقًا)، مما يؤدي إلى حظر التنفيذ حتى اكتمال تنفيذ الدالة وتوفر النتيجة. [ 10 ] عادةً ما يوفر الكائن AsyncResultدالة واحدة على الأقل تُمكّن العميل من الاستعلام عما إذا كانت الدالة طويلة الأمد قد اكتملت بالفعل.

interface IAsyncResult { bool HasCompleted () }

يمكن أيضًا تمرير دالة رد نداء إلى الدالة BeginAccomplish، ليتم استدعاؤها عند اكتمال الدالة طويلة الأمد. وعادةً ما تستدعي هذه الدالة EndAccomplishللحصول على القيمة المُعادة من الدالة طويلة الأمد. تكمن إحدى مشكلات آلية رد النداء في أن دالة رد النداء تُنفَّذ تلقائيًا في سلسلة العمليات العاملة (بدلاً من سلسلة العمليات الأصلية المُستدعِية)، مما قد يُسبب حالات تضارب. [ 11 ] [ 12 ]

في وثائق إطار عمل .NET، يشير مصطلح "نمط غير متزامن قائم على الأحداث" إلى نمط واجهة برمجة تطبيقات بديل (متوفر منذ .NET 2.0) يستخدم طريقةً تُسمى AccomplishAsyncبدلاً من BeginAccomplish. [ 13 ] [ 14 ] يتمثل الاختلاف الظاهري في أن القيمة المُعادة من الطريقة طويلة الأمد تُمرر مباشرةً إلى طريقة الاستدعاء. والأهم من ذلك، أن واجهة برمجة التطبيقات تستخدم آليةً خاصةً لتشغيل طريقة الاستدعاء (الموجودة في كائن حدث من النوع AccomplishCompleted) في نفس سلسلة العمليات التي BeginAccomplishتم استدعاء فيها. هذا يُزيل خطر حدوث حالات تضارب، مما يجعل واجهة برمجة التطبيقات أسهل استخدامًا ومناسبةً لمكونات البرامج؛ من ناحية أخرى، يأتي هذا التطبيق للنمط مع تكلفة إضافية لإنشاء الكائنات ومزامنتها. [ 15 ]

مراجع

  1. "استدعاء الأساليب غير المتزامنة" . البرمجة الموزعة باستخدام ICE . شركة ZeroC. مؤرشف من الأصل في 5 يناير 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  2. ^ فيرميولين ، آلان (يونيو 1996). "نمط تصميم غير متزامن" . مجلة الدكتور دوب . تم الاسترجاع 22 نوفمبر 2008 .
  3. ناش، تري (2007). "الخيوط في لغة سي شارب". سي شارب المُسرّعة 2008. أبريس. ISBN 978-1-59059-873-3.
  4. لافندر، ر. جريج؛ دوغلاس س. شميدت . "الكائن النشط" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 22 يوليو 2012. تم الاطلاع عليه بتاريخ 22 نوفمبر 2008 .{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal=
  5. "فئة FutureTask" . أوراكل. 2011. مؤرشف من الأصل بتاريخ 25-06-2013 . تم الاطلاع عليه بتاريخ 29-06-2015 .
  6. "نموذج البرمجة غير المتزامنة" . مايكروسوفت. 2015. تم الاطلاع عليه بتاريخ 29-06-2015 .
  7. "نظرة عامة على نمط البرمجة غير المتزامنة القائمة على الأحداث" . مايكروسوفت. 2015. تم الاطلاع عليه بتاريخ 29-06-2015 .
  8. "نمط غير متزامن قائم على المهام" . مايكروسوفت. 2015. تم الاسترجاع في 29-06-2015 .
  9. "أنماط تصميم البرمجة غير المتزامنة" . دليل مطوري إطار عمل .NET . شبكة مطوري مايكروسوفت. مؤرشف من الأصل في 22 نوفمبر 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  10. "نظرة عامة على البرمجة غير المتزامنة" . دليل مطوري إطار عمل .NET . شبكة مطوري مايكروسوفت. مؤرشف من الأصل في 7 ديسمبر 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  11. "استخدام مفوض AsyncCallback لإنهاء عملية غير متزامنة" . دليل مطوري .NET Framework . شبكة مطوري مايكروسوفت. مؤرشف من الأصل في 23 ديسمبر 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  12. "مشكلات التزامن" . البرمجة الموزعة باستخدام ICE . شركة ZeroC. مؤرشف من الأصل في 28 مارس 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  13. كريستيان ناجل؛ بيل إيفجين؛ جاي جلين؛ كارلي واتسون ومورغان سكينر (2008). "نمط البرمجة غير المتزامنة القائم على الأحداث". كتاب "C# الاحترافي 2008 " . وايلي. الصفحات 570-571 . ISBN  9780470191378.
  14. "البرمجة متعددة الخيوط باستخدام نمط البرمجة غير المتزامنة القائم على الأحداث" . دليل مطوري إطار عمل .NET . شبكة مطوري مايكروسوفت. مؤرشف من الأصل في 25 ديسمبر 2008. تم الاطلاع عليه في 22 نوفمبر 2008 .
  15. "تحديد الوقت المناسب لتطبيق نمط البرمجة غير المتزامنة القائم على الأحداث" . دليل مطوري إطار عمل .NET . شبكة مطوري مايكروسوفت. مؤرشف من الأصل بتاريخ 22 نوفمبر 2008. تم الاطلاع عليه بتاريخ 22 نوفمبر 2008 .

للمزيد من القراءة