أنماط الأحداث ضعيفة

في التطبيقات، فإنه هو ممكن أن معالجات المرفقة بمصادر الأحداث سوف لا تلف بالتنسيق مع الكائن lهوtener مرفقة المعالج المصدر. يمكن أن يؤدي هذا الموقف إلى تسرب ذاكرة. Windows Presentation Foundation (WPF)يقدم نمط تصميم التي يمكن استخدامها إلى معالجة هذه المشكلة، بتوفير فئة مدير مخصص لإحداث معينة وقم بتنفيذ واجهة تشغيل رسائل لهذا حدث. Th هو نمط التصميم هو يعرف النقش حدث ضعيفة .

لماذا تنفذ نقش حدث الضعيفة؟

الاستماع لأحداث قد يؤدي لتسرب الذاكرة. التقنية النموذجية للاستماع لحدث هو استخدم بناء الجملة محددة اللغة الذي يصل معالج لحدث على مصدر. على سبيل المثال، في #C، أن بناء الجملة هو: source.SomeEvent += new SomeEventHandler(MyEventHandler).

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

نمط حدث ضعيفة هو مصمم لحل th هو مشكلة حدوث تسرب للذاكرة. يمكن أن يستخدم نقش حدث ضعيفة كلما أحتاج موزع رسائل إلى التسجيل لحدث ما، ولكن وحدة الإصغاء عدم وضوح تعرف متى إلى إلغاء تسجيل. يمكن أن يكون نقش حدث ضعيفة المستخدمة عند كائن يتجاوز عمر المصدر مفيدة في كائن عمر وحدة إصغاء. (في ترتيب هو الحالة مفيدة هو التي يفرضها.) يسمح نقش حدث ضعيفة وحدة الإصغاء إلى التسجيل واستقبال حدث دون التأثير على الصفات المميزة لمدة حياة الكائن وحدة إصغاء بأي طريقة. في الواقع، لا تحديد المرجع ضمنية من المصدر ما إذا كان lهوtener هو لمجموعة البيانات المهملة. المرجع هو مرجع ضعيف، وهكذا تسمية النمط حدث ضعيفة و ذات الصلة واجهات API. يمكن لوحدة الإصغاء ان تجمع كالمهملات أو تعرض للإتلاف, والمصدر يمكن له المتابعة دون الاحتفاظ بمراجع المعالج الغير قابلة للتحصيل لإتلاف كائن الآن.

الذين يجب أن تنفذ نقش حدث الضعيفة؟

تطبيق النمط حدث ضعيفة هو الشيقة أساسا للمؤلفين عنصر التحكم. ككاتب عنصر تحكم، أنت كبير مسؤول عن سلوك وعلاقات الاحتواء عنصر التحكم الخاص بك وتأثير له تشغيل التطبيقات الموجودة عليها هو إدراجها. يتضمن ذلك سلوك عمر كائن عنصر التحكم، بشكل خاص إلى معالجة مشكلة تسرب ذاكرة هو موضح.

وحدات سيناريو معينة مثل إعارتها نفسها إلى تطبيق ضعيف حدث نقش. واحد السيناريو هو ربط بيانات. في ربط بيانات، فإنه هو الشائعة للكائن المصدر أن تكون مستقلة تماما عن الكائن lهوtener، الذي هو هدف الربط. العديد من أوجه WPFربط بيانات بالفعل يكون نقش حدث ضعيفة تطبيقها في كيفية تنفيذ الأحداث.

كيف إلى تنفيذ نقش الأحداث ضعيف

تنفيذ حدث ضعيفة نقش يتكون من الأوجه الثلاثة التالية:

  • اشتقاق مدير من الفئةWeakEventManager.

  • تنفيذ الواجهةIWeakEventListenerعلى أي فئة يريد تسجيل وحدات اصغاء للحدث الضعيف بدون إنشاء مرجع قوي المصدر.

  • عند تسجيل وحدات الاصغاء,لا تستخدم الوظيفة الاصطلاحية وإزالة موصلات الحدث الذي تريده وحدة الإصغاء لاستخدام النقش. بدلاً من ذلك، استخدم AddListenerو RemoveListenerتطبيقات في مخصصة WeakEventManagerلهذا حدث.

مدير WeakEvent

إلى تطبيق النمط حدث ضعيفة، تقوم بإنشاء فئة مدير عادة بعلاقة 1: 1 إلى حدث. على سبيل المثال، إذا كان لديك حدث مسمى Spin، الذي يؤدي إلى إنشاء SpinEventManagerفئة هو مدير الحدث ضعيفة مخصص للحدث. في حالة وجود الحدث في فئة واحد أو أكثر، يتصرف بشكل عام في كل فئة، و نوع بيانات الحدث نفسه بمشاركات، يمكن استخدام نفس المدير لكل حدث.

عندما ينحدر من WeakEventManagerفئة، وتجاوز أسلوبين الظاهرية وتعرض عدة غير ذلك الأعضاء أسماؤها هي وفق خاصة بقالب ظاهرية، ولكن يجب أن يكون موجوداً nonetheless. يتم استخدام التجاوزات لببدء أو إنهاء وضع تسليم الحدث بواسطة البنية الأساسيةWPF . الأعضاء الآخرين بتوفير وظائف حيث الخاص بك IWeakEventListenerيمكن استخدام تطبيقات WeakEventManagerإلى إرفاق رسائل إلى الحدث.

للحصول على مزيد من المعلومات حول اشتقاق من WeakEventManager، راجع مقطع "ملاحظات إلى Inheriإلىrs" في WeakEventManagerمرجع إلى صورة.

وحدة اصغاءIWeakEvent

IWeakEventListenerواجهة على أسلوب واجهة واحدة باسم ReceiveWeakEvent. التطبيقReceiveWeakEvent يجب أن يكون تطبيق مركزي يوجه أي مرجع أحداث على تلك الفئة لل WeakEventManagerالمناسب.

لمزيد من المعلومات حول تنفيذ IWeakEventListenerالواجهة، راجع مقطع "ملاحظات إلى Implementers" في ReceiveWeakEventالطريقة مرجع إلى صورة.

إرفاق وحدات اصغاء

افترض أن لديك ClockwiseSpinحدث (المعرفة من قبل Spinnerالنوع) هو أحد الاصطلاحية حدث. إذا كان لديك SpinListenerفئة موزع الرسائل التي يريد إلى أن تكون موزع رسائل، تقنية الاصطلاحية (لا تستخدم نمط حدث ضعيفة) للمعالج إرفاق ستكون إلى استخدام operaإلىr + =:

spinnerInstance.ClockwiseSpin += new EventHandler(MyOnCWSpinHandler);

إذا كان لديك فئة تطبيق IWeakEventListenerوعن ClockwiseSpinحدث والمدير الخاص به في التطبيق، وبناء الجملة المستخدم نقش حدث ضعيف هو:

ClockwiseSpinEventManager.AddListener(spinnerInstance, this);

يتم تحديد منطق المعالجة الخاصة بك لهذا حدث في إحدى الحالات ReceiveWeakEventتطبيق في الفئة، وليس الاصطلاحية المستندة إلى المفوض معالج.

تطبيق النقش علي أحداث خارجية

جانب مثيرة للاهتمام واحد نقش ضعيفة الحدث هو تطبيق النمط ضد حدث ليس جزءا من تعليمات برمجية الأساسية. من منظور المصدر,الطريقة التي بها المعالجات متصلة بالحدث الخاص به لا تختلف, و يتحكم ب
 WeakEventManager. تحتاج فقط إلى تحديد WeakEventManagerلهذا حدث، و ثم حساب لهذا حدث كجزء من ReceiveWeakEventالمنطق تشغيل أي وحدة إصغاء سيرة الذي يريد استخدام نمط حدث ضعيفة للاستماع إلى تلك الأحداث.

راجع أيضًا:

المرجع

WeakEventManager

IWeakEventListener

المبادئ

نظرة عامة حول الأحداث الموجهة

نظرة عامة لربط البيانات