تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
موضوع للنقاش- الفئة WeakReference
#4
كاتب المشاركة : Islam Ibrahim

اقتباس:
[TABLE="width: 100%"]
[TR]
[TD="class: alt2"]المشاركة الأساسية كتبها Marwan Aouida
هذه أول مرة أسمع عن WeakReference و بعد ما قرأته هنا و في مكتبة MSDN ، مازلت لا أرى الفائدة من هذه الفئة.
[/TD]
[/TR]
[/TABLE]

من أهم الطرق التي تسهل عمل GC هو استخدام مؤشرات الترابط الضعيفة Weak References.

مؤشرات الترابط الضعيفة هذه تمكِّن جامع البيانات المهملة GC من جمع الكائن في نفس الوقت الذي يستطيع التطبيق الوصول إلى نفس الكائن. ويكون هذا صالحا لفترة زمنية محددة حتى يتم جمع الكائن نهائيا عندما لاتكون هناك مؤشرات ترابط قوية Strong References,

تستخدم مؤشرات الترابط الضعيفة مع الكائنات التي تستهلك قدراً كبيراً من الذاكرة, وفي نفس الوقت يمكن إعادة إنشاء الكائن بسهولة بعد جمعه من طرف جامع البيانات المهملة.

لنأخذ المثال التالي: افترض أن لديك DataSet ذو حجم كبير في تطبيقك ويحتوي على تركيب معقد, فإن تواجد DataSet في الذاكرة طوال الوقت فكرة سيئة.

ولنفترض أن مستخدم تطبيقك انتقل إلى جزء آخر من التطبيق (قام بفتح نموذج آخر), عندها يمكنك استخدام الفئة WeakReference لإنشاء مؤشر ترابط ضعيف إلى كائن ال DataSet وتدمير كافة مؤشرات الترابط القوية, عندما يعود المستخدم إلى الجزء من التطبيق الذي يحتوي كائن DataSet عندها سيقوم التطبيق بإنشاء مؤشر قوي مجدداً عندها سينجح, وبذلك سيتجنب التطبيق إعادة بناء كائن DataSet مجدداً.

لإنشاء مؤشر ترابط ضعيف يجب أن ننشأ كائن WeakReference وأن نجعل كائننا هذا (DataSet) هدفا لخاصية Target الخاصة بكائن WeakReference, بعد ذلك نسند القيمة Nothing لكائن DataSet.

يجب أن نتجنب استخدام WeakReferences مع كائنات ذات الحجم الصغير لأن حجم المؤشر يمكن أن يكون أكبر من حجم الكائن نفسه, عندها لن يكون لاستخدامه فائدة.

لنأخذ المثال التالي, وهو أبسط صورة يمكن من خلالها استخدام Weak References.



كود :
Private Data As WeakReference

Public Function GetData() As DataSet
Dim tempData As DataSet = DirectCast(Data.Target, DataSet)
If Not (tempData Is Nothing) Then
Return tempData
Else
tempData = LoadBigDataSource()
Data.Target = tempData
End If
Return tempData
End Function
لاحظ أننا قمنا بإسناد مؤشر قوي إلى المؤشر الضعيف في بداية الدالة السابقة


كود :
Dim tempData As DataSet = Data.Target
الهدف من ذلك هو منع GC من الوصول إلى محتويات الكائن Data قبل التحقق من أنه Null. فكما ذكرنا سابقاً فإن إسناد مؤشر قوي يمنع GC من الوصول إلى الكائن وجمعه.
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
موضوع للنقاش- الفئة WeakReference - بواسطة Raggi Tech - 05-10-12, 01:24 AM


التنقل السريع :


يقوم بقرائة الموضوع: