الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الفئة Weakreference

بدأه محمد سامر أبو سلو في 24 أغسطس 2009 · 1 رد · 865 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تمثل الفئة WeakReference مرجعا ضعيفا يؤشر إلى غرض Object مع إبقاء تمكين جامع النفايات من التعامل معه وهي موجودة ضمن مجال الأسماء System في المجمع mscorlib.dll والتصريح عنها يأتي كما يلي

<SerializableAttribute> <ComVisibleAttribute(True)> _
<SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags := SecurityPermissionFlag.UnmanagedCode)> _
Public Class WeakReference _
Implements ISerializable

واستخدامها

Dim instance As WeakReference

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

يرينا المثال التالي كيف يمكننا استخدام المرجع الضعيف للمحافظة على مخبأ للأغراض كمصادر للتطبيق حيث يتم إنشاء المخبأ باستخدام IDictionary(TKey, TValue) حيث يتم تصنيف الأغراض بفهرس من المفاتيح حيث تحتوي الخاصية Target لأغراض WeakReference على مصفوفة تمثل البيانات

Imports System
Imports System.Collections.Generic
Public Class Module1

    Public Shared Sub Main()

        ' Create the cache.
        Dim cacheSize As Integer = 50
        Dim r As Random = New Random
        Dim c As Cache = New Cache(cacheSize)

        Dim DataName As String = ""

        ' Randomly access objects in the cache.
        Dim i As Integer
        Do While i < c.Count
            Dim index As Integer = r.Next(c.Count)

            ' Access the object by
            ' getting a property value.
            DataName = c(index).Name

            i += 1
        Loop

        'Show results.
        Dim regenPercent As Double = c.RegenerationCount * 100 / c.Count
        Console.WriteLine("Cache size: {0}, Regenerated: {1}%", c.Count.ToString(), regenPercent.ToString())

    End Sub
End Class
Public Class Cache

    ' Dictionary to contain the cache.
    Private Shared _cache As Dictionary(Of Integer, WeakReference)

    ' Track the number of times an
    ' object is regenerated.
    Dim regenCount As Integer = 0

    Public Sub New(ByVal count As Integer)
        MyBase.New()
        _cache = New Dictionary(Of Integer, WeakReference)

        ' Add data objects with a short
        ' weak reference to the cache.
        Dim i As Integer = 0
        Do While (i < count)
            _cache.Add(i, New WeakReference(New Data(i)))
            i = (i + 1)
        Loop
    End Sub

    ' Number of items in the cache.
    Public ReadOnly Property Count() As Integer
        Get
            Return _cache.Count
        End Get
    End Property

    ' Number of times an
    ' object needs to be regenerated.
    Public ReadOnly Property RegenerationCount() As Integer
        Get
            Return regenCount
        End Get
    End Property

    ' Access a data object from the cache.
    ' If the object was reclaimed for garbage collection,
    ' create a new data object at that index location.
    Default Public ReadOnly Property Item(ByVal index As Integer) As Data
        Get
            ' Obtain an instance of a data
            ' object from the cache of
            ' of weak reference objects.
            Dim d As Data = CType(_cache(index).Target, Data)
            If (d Is Nothing) Then
                ' Object was reclaimed, so generate a new one.
                Console.WriteLine("Regenerate object at {0}: Yes", index.ToString())
                d = New Data(index)
                regenCount += 1
            Else
                ' Object was obtained with the weak reference.
                Console.WriteLine("Regenerate object at {0}: No", index.ToString())
            End If
            Return d
        End Get

    End Property
End Class

' Class that creates byte arrays to simulate data.
Public Class Data

    Private _data() As Byte

    Private _name As String

    Public Sub New(ByVal size As Integer)
        MyBase.New()
        _data = New Byte(((size * 1024)) - 1) {}
        _name = size.ToString
    End Sub

    ' Simple property for
    ' accessing the object.
    Public ReadOnly Property Name() As String
        Get
            Return _name
        End Get
    End Property
End Class

' Example of the last lines of the output:
' ...
' Regenerate object at 36: Yes
' Regenerate object at 8: Yes
' Regenerate object at 21: Yes
' Regenerate object at 4: Yes
' Regenerate object at 38: No
' Regenerate object at 7: Yes
' Regenerate object at 2: Yes
' Regenerate object at 43: Yes
' Regenerate object at 38: No
' Cache size: 50, Regenerated: 94%
'

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 24 أغسطس 2009 في 15:03

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

متى نحتاج إلى استخدام المرجع الضعيف WeakReference

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

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

يمكنك إنشاء رابط ضعيف لغرض ما بتمرير ذلك الغرض كمحدد لباني WeakReference

WeakReference eg = New WeakReference (obj)

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

Obj = eg.Target

ويوفر لنا النوع WeakReference بانيين فالأول يستقبل غرض Object والثاني يستقبل محدد إضافي يدعى TrackResurrection والذي هو عبارة عن قيمة منطقية فإن كانت True فسيتم الإبقاء على المرجع بعد أن يتم استدعاء الوظيفة Finalize لذلك الغرض مما يسمح بإعادة إنشاء ذلك الغرض ومع ذلك تبقى حالة ذلك الغرض غير ممكن التنبؤ بها حيث يمكنك استخدام هذه مع الأغراض الثقيلة فقط وتذكر أن المرجع الضعيف WeakReference يدير الأغراض وله سقوف محددة

استخدام المراجع الضعيفة

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

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

ويمكننا تمييز نوعان من المراجع الضعيفة:

القصير: الهدف من المرجع القصير الضعيف يصبح Null عندما يقوم جامع النفايات بجمع الغرض المرتبط بالمرجع الضعيف ويعتبر المرجع الضعيف ذات نفسه من الأنواع المدارة وعرضة للجمع من قبل جامع النفايات كأي غرض مدار آخر ويكون المرجع الضعيف القصير هو النوع الافتراضي لباني WeakReference

الطويل: يحتفظ بالمرجع الطويل الضعيف بعد استدعاء الطريقة Finalize للغرض مما يمكن من إعادة إنشاء الغرض ولكن تبقى حالة الغرض غير محددة ولاستخدام المرجع الطويل قم بتمرير القيمة True للمحدد الثاني لباني WeakReference

وإن لم يمتلك الغرض الطريقة finalize يتم تطبيق وظيفية المرجع القصير الضعيف ويبقى المرجع الضعيف متاحا فقط حتى يتم جمع الهدف الأمر الذي قد يحدث في أي وقت بعد أن يتم تشغيل المنهي Finalizer ولتأسيس مرجع قصير واستخدام الغرض مرة أخرى حول Cast الخاصية Target لـ WeakReference إلى نوع Type ذلك الغرض Object فإن كانت قيمة الخاصية Target هي Null فالغرض قد تم جمعه وإن لا فعندها يمكنك المتابعة واستخدام الغرض لأن التطبيق استعاد المرجع القوي له

إرشادات لاستخدام الفئة WeakReference

- استخدم المرجع الطويل الضعيف فقط عندما يكون ذلك ضروريا لأن حالة الغرض قد تكون غير قابلة للتنبؤ بعد أن يتم إنهاؤه

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

- تجنب استخدام المراجع الضعيفة كحل آلي لإدارة مشاكل الذاكرة وعوضا عن ذلك قم بتطوير سياسة إخباء Caching فعالة للتعامل مع أغرض التطبيق

باني الفئة

يتوفر بثلاثة أشكال:

WeakReference Constructor (Object)

يقوم بإنشاء متغيرا من النوع WeakReference يشير للغرض الممرر حيث ينشئ مرجعا قصيرا ضعيفا لذلك الغرض

الصيغة

PublicSub New ( _

target As

Object _

)

الاستخدام

Dim target As

Object

Dim instance As New

WeakReference(target)

WeakReference Constructor (Object, Boolean)

يقوم بإنشاء متغيرا من النوع WeakReference يشير للغرض الممرر ويستخدم تتبع إعادة الإحياء. فإن كان المحدد الثاني False يتم إنشاء مرجع قصير ضعيف وإن كان True يتم إنشاء مرجع طويل ضعيف

الصيغة

PublicSub New ( _

target As

Object, _

trackResurrection As

Boolean _

)

الاستخدام

Dim target As

Object

Dim trackResurrection As

Boolean

Dim instance As New

WeakReference(target, _

trackResurrection)

مثال

Shared wr AsNew WeakReference(objA1, False)

Shared wr AsNew WeakReference(objA1, True)

المحددات

- Target هو الغرض Object المراد تتبعه و نوعه System.Object

- trackResurrection هو من النوع System.Boolean وهو يحدد متى سيتم التوقف عن متابعة الغرض فإن كان True فالغرض سيتم متابعته بعد إنهائه وإن كان False فسيتم التوقف عن متابعة الغرض عند إنهائه

WeakReference Constructor (SerializationInfo, StreamingContext)

ينشئ متغيرا من النوع WeakReference مستخدما بيانات محددة مستخدما أغراض Serialization و Stream,.

الصيغة

ProtectedSub New ( _

context As

StreamingContext _

)

الاستخدام

Dim info As

SerializationInfo

Dim context As

StreamingContext

Dim instance As New

WeakReference(info, context)

المحددات

- Info هو من النوع System.Runtime.Serialization.SerializationInfo وهو غرض يحمل جميع المعلومات التي نحتاجها لتخزين أو استعادة غرض WeakReference الحالي. ويعيد استثناء ArgumentNullException إن كانت قيمة info هي nothing

- Context هو من النوع System.Runtime.Serialization.StreamingContect ( محجوز ) يصف المصدر والهدف للغرض المحدد بـ info وهو محجوز ولا يقوم بأي دور حاليا في العملية

عناصر الفئة

الطرائق

Equals يحدد إذا كان الغرض المحدد مساويا للغرض الحالي

Finalize يتخلص من المرجع إلى الهدف الممثل بالغرض WeakReference الحالي

GetHashCode يخدم كوظيفة تهشير للنوع المحدد

GetObjectData ينشئ غرض SerializationInfo يحتوي على جميع المعلومات التي نحتاجها لتخزين غرض WeakReference الحالي

GetObjectData يعيد نوع المتغير الحالي

MemberwiseClone ينشئ نسخة سطحية من الغرض الحالي

ToString يعيد سلسلة نصية تمثل الغرض الحالي

الخصائص

IsAlive تعيد بيانا فيما إذا كان الغرض الذي يشير إليه غرض WeakReference الحالي قد تم جمعه بواسطة جامع النفايات

Target تعيد أو تضبط الغرض الذي يشير إليه غرض WeakReference الحالي

TrackResurrection تعيد بيانا فيما إذا كان الغرض المشار إليه من قبل الغرض Weakreference الحالي متتبعا بعد أن يتم إنهاؤ ه

وفي نهاية التعريف بالفئة وخصائصها إليكم بعض المعلومات عن هذه الفئة منسوخة كما هي من مكتبة MSDN

Inheritance Hierarchy

System.Object

System.WeakReference

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Platforms

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Version Information

.NET Framework

Supported in: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0, 1.0

XNA Framework

Supported in: 1.0

WeakReference.IsAlive Property

تعيد بيانا فيما إذا كان قد تم جمع الغرض المشار إليه بواسطة غرض WeakReference الحالي من قبل جامع النفايات

التصريح

Public Overridable ReadOnly Property IsAlive As

Boolean

الاستخدام

Dim instance As

WeakReference

Dim value As

Boolean

value = instance.IsAlive

تعيد قيمة من النوع System.Boolean حيث تكون القيمة True إن كان الغرض الذي يسير إليه الغرض WeakReference الحالي لم يتم جمعه و False إن تم جمعه من قبل جامع النفايات حيث يمكنك استخدام هذه الخاصية لمراقبة حالة الغرض طالما أنه يمتلك مرجعا ضعيفا

مثال

If (wr.IsAlive = False) Then

	' Object is collected and

	' all references terminated.

	Console.WriteLine("Object collected")

	aTimer.Stop()

Else

	Console.WriteLine("count {0}, still alive - long weak reference: {1}", _

		count.ToString(), wr.TrackResurrection.ToString)

	count = (count + 1)

End If

WeakReference. Target Property

تعيد أو تضبط الغرض الذي يشير إليه غرض WeakReference الحالي

التصريح

Public Overridable Property Target As

Object

الاستخدام

Dim instance As

WeakReference

Dim value As

Object

value = instance.Target

instance.Target = value

الخاصية من النوع System.Object تعيد القيمة nothing إذا كان الغرض المشار إليه بواسطة غرض WeakReference الحالي قد تم جمعه بواسطة جامع النفايات وإلا فسوف تعيد قيمة تمثل الغرض المشار إليه بواسطة الغرض WakReference

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

بعد ضبط هذه القيمة إلى الغرض الهدف تأكد من عدم وجود أية مراجع قوية باقية لذلك الغرض فإن بقيت هذه المراجع القوية فلن يكون بالإمكان جمعه وبالتالي لن تصبح قيمة الخاصية nothing

مثال

' Set the target of the

' weak reference to the object.

wr.Target = objA1



' Remove the strong reference

' the application has to the object.

objA1 = Nothing

If objA1 Is Nothing Then

	Console.WriteLine("After setting objA1 to null: objA1 is null.")

End If

WeakReference. TrackResurrection Property

تعيد بيانا فيما إذا كان الغرض المشار إليه من قبل الغرض Weakreference الحالي متتبعا بعد أن يتم إنهاؤ ه

التصريح

Public Overridable ReadOnly Property TrackResurrection As Boolean

الاستخدام

Dim instance As WeakReference

Dim value As Boolean

value = instance.TrackResurrection

وهي تعيد قيمة من النوع System.Boolean حيث تعيد القيمة True إن كان الغرض المشار إليه بواسطة الغرض WeakReference يتم تتبعه بعد إنهائه و False إن لم يتم تتبعه بعد إنهائه

إن كان القيمة True فهو مرجع طويل ضعيف وقد تم ضبط المحدد trackResurrection الخاص بباني الفئة إلى True

مثال

Console.WriteLine("count {0}, still alive - long weak reference: {1}", _	

count.ToString(), wr.TrackResurrection.ToString)

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 24 أغسطس 2009 في 15:18

1

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

مواضيع مشابهة