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

رجاء حار أريد أن يكون هذا الموضوع للنقاش العلمي حصرا يرجى عدم طرح مشاركات شكر أريد مشاركات نقاش حول هذا الموضوع فقط

سأبتدئ هذا الموضوع بهذه الفقرة المترجمة من مكتبة MSDN للتعريف بهذه الفئة

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

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

واستخدامها

Dim instance As WeakReference

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



كود :
[COLOR=#000000][COLOR=#0000bb]Imports System
Imports System[/COLOR][color=#007700].[/color][color=#0000bb]Collections[/color][color=#007700].[/color][COLOR=#0000bb]Generic
[/COLOR][color=#007700]Public Class [/color][COLOR=#0000bb]Module1

    [/COLOR][color=#007700]Public [/color][color=#0000bb]Shared Sub Main[/color][COLOR=#007700]()

        [/COLOR][COLOR=#dd0000]' 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 = ""

        ' [/COLOR][color=#0000bb]Randomly access objects in the cache[/color][COLOR=#007700].
        [/COLOR][color=#0000bb]Dim i [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
        [/COLOR][color=#007700]Do While [/color][color=#0000bb]i [/color][color=#007700]< [/color][color=#0000bb]c[/color][color=#007700].[/color][COLOR=#0000bb]Count
            Dim index [/COLOR][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][color=#0000bb]r[/color][color=#007700].[/color][color=#0000bb]Next[/color][color=#007700]([/color][color=#0000bb]c[/color][color=#007700].[/color][color=#0000bb]Count[/color][COLOR=#007700])

            [/COLOR][COLOR=#dd0000]' Access the object by
            ' [/COLOR][color=#0000bb]getting a property value[/color][COLOR=#007700].
            [/COLOR][color=#0000bb]DataName [/color][color=#007700]= [/color][color=#0000bb]c[/color][color=#007700]([/color][color=#0000bb]index[/color][color=#007700]).[/color][COLOR=#0000bb]Name

            i [/COLOR][color=#007700]+= [/color][COLOR=#0000bb]1
        Loop

        [/COLOR][COLOR=#dd0000]'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

    ' [/COLOR][color=#0000bb]Dictionary to contain the cache[/color][COLOR=#007700].
    Private [/COLOR][color=#0000bb]Shared _cache [/color][color=#007700]As [/color][color=#0000bb]Dictionary[/color][color=#007700]([/color][color=#0000bb]Of Integer[/color][color=#007700], [/color][color=#0000bb]WeakReference[/color][COLOR=#007700])

    [/COLOR][COLOR=#dd0000]' Track the number of times an
    ' [/COLOR][color=#0000bb]object is regenerated[/color][COLOR=#007700].
    [/COLOR][color=#0000bb]Dim regenCount [/color][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][COLOR=#0000bb]0

    [/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal count [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
        [/COLOR][color=#0000bb]MyBase[/color][COLOR=#007700].New()
        [/COLOR][color=#0000bb]_cache [/color][color=#007700]= New [/color][color=#0000bb]Dictionary[/color][color=#007700]([/color][color=#0000bb]Of Integer[/color][color=#007700], [/color][color=#0000bb]WeakReference[/color][COLOR=#007700])

        [/COLOR][COLOR=#dd0000]' Add data objects with a short
        ' [/COLOR][color=#0000bb]weak reference to the cache[/color][COLOR=#007700].
        [/COLOR][color=#0000bb]Dim i [/color][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= [/color][COLOR=#0000bb]0
        [/COLOR][color=#007700]Do While ([/color][color=#0000bb]i [/color][color=#007700]< [/color][color=#0000bb]count[/color][COLOR=#007700])
            [/COLOR][color=#0000bb]_cache[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]i[/color][color=#007700], New [/color][color=#0000bb]WeakReference[/color][color=#007700](New [/color][color=#0000bb]Data[/color][color=#007700]([/color][color=#0000bb]i[/color][COLOR=#007700])))
            [/COLOR][color=#0000bb]i [/color][color=#007700]= ([/color][color=#0000bb]i [/color][color=#007700]+ [/color][color=#0000bb]1[/color][COLOR=#007700])
        [/COLOR][COLOR=#0000bb]Loop
    End Sub

    [/COLOR][COLOR=#dd0000]' Number of items in the cache.
    Public ReadOnly Property Count() As Integer
        Get
            Return _cache.Count
        End Get
    End Property

    ' [/COLOR][COLOR=#0000bb]Number of times an
    [/COLOR][COLOR=#dd0000]' object needs to be regenerated.
    Public ReadOnly Property RegenerationCount() As Integer
        Get
            Return regenCount
        End Get
    End Property

    ' [/COLOR][color=#0000bb]Access a data object from the cache[/color][COLOR=#007700].
    [/COLOR][COLOR=#dd0000]' If the object was reclaimed for garbage collection,
    ' [/COLOR][color=#0000bb]create a [/color][color=#007700]new [/color][color=#0000bb]data object at that index location[/color][COLOR=#007700].
    Default Public [/COLOR][color=#0000bb]ReadOnly Property Item[/color][color=#007700]([/color][color=#0000bb]ByVal index [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Data
        Get
            [/COLOR][COLOR=#dd0000]' Obtain an instance of a data
            ' [/COLOR][COLOR=#0000bb]object from the cache of
            [/COLOR][COLOR=#dd0000]' of weak reference objects.
            Dim d As Data = CType(_cache(index).Target, Data)
            If (d Is Nothing) Then
                ' [/COLOR][color=#0000bb]Object was reclaimed[/color][color=#007700], [/color][color=#0000bb]so generate a [/color][color=#007700]new [/color][color=#0000bb]one[/color][COLOR=#007700].
                [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Regenerate object at {0}: Yes"[/color][color=#007700], [/color][color=#0000bb]index[/color][color=#007700].[/color][color=#0000bb]ToString[/color][COLOR=#007700]())
                [/COLOR][color=#0000bb]d [/color][color=#007700]= New [/color][color=#0000bb]Data[/color][color=#007700]([/color][color=#0000bb]index[/color][COLOR=#007700])
                [/COLOR][color=#0000bb]regenCount [/color][color=#007700]+= [/color][COLOR=#0000bb]1
            [/COLOR][COLOR=#007700]Else
                [/COLOR][COLOR=#dd0000]' 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

' [/COLOR][color=#007700]Class [/color][color=#0000bb]that creates byte arrays to simulate data[/color][COLOR=#007700].
Public Class [/COLOR][COLOR=#0000bb]Data

    [/COLOR][color=#007700]Private [/color][color=#0000bb]_data[/color][color=#007700]() As [/color][COLOR=#0000bb]Byte

    [/COLOR][color=#007700]Private [/color][color=#0000bb]_name [/color][color=#007700]As [/color][COLOR=#0000bb]String

    [/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal size [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
        [/COLOR][color=#0000bb]MyBase[/color][COLOR=#007700].New()
        [/COLOR][color=#0000bb]_data [/color][color=#007700]= New [/color][color=#0000bb]Byte[/color][color=#007700]((([/color][color=#0000bb]size [/color][color=#007700]* [/color][color=#0000bb]1024[/color][color=#007700])) - [/color][color=#0000bb]1[/color][COLOR=#007700]) {}
        [/COLOR][color=#0000bb]_name [/color][color=#007700]= [/color][color=#0000bb]size[/color][color=#007700].[/color][COLOR=#0000bb]ToString
    End Sub

    [/COLOR][COLOR=#dd0000]' Simple property for
    ' [/COLOR][color=#0000bb]accessing the object[/color][COLOR=#007700].
    Public [/COLOR][color=#0000bb]ReadOnly Property Name[/color][color=#007700]() As [/color][COLOR=#0000bb]String
        Get
            [/COLOR][color=#007700]Return [/color][COLOR=#0000bb]_name
        End Get
    End Property
End [/COLOR][COLOR=#007700]Class

[/COLOR][COLOR=#dd0000]' Example of the last lines of the output:
' [/COLOR][COLOR=#007700]...
[/COLOR][COLOR=#dd0000]' Regenerate object at 36: Yes
' [/COLOR][color=#0000bb]Regenerate object at 8[/color][color=#007700]: [/color][COLOR=#0000bb]Yes
[/COLOR][COLOR=#dd0000]' Regenerate object at 21: Yes
' [/COLOR][color=#0000bb]Regenerate object at 4[/color][color=#007700]: [/color][COLOR=#0000bb]Yes
[/COLOR][COLOR=#dd0000]' Regenerate object at 38: No
' [/COLOR][color=#0000bb]Regenerate object at 7[/color][color=#007700]: [/color][COLOR=#0000bb]Yes
[/COLOR][COLOR=#dd0000]' Regenerate object at 2: Yes
' [/COLOR][color=#0000bb]Regenerate object at 43[/color][color=#007700]: [/color][COLOR=#0000bb]Yes
[/COLOR][COLOR=#dd0000]' Regenerate object at 38: No
' [/COLOR][color=#0000bb]Cache size[/color][color=#007700]: [/color][color=#0000bb]50[/color][color=#007700], [/color][color=#0000bb]Regenerated[/color][color=#007700]: [/color][color=#0000bb]94[/color][COLOR=#007700]%
  
[/COLOR][color=#0000bb][/color][/COLOR]
}}}
تم الشكر بواسطة:
#2
كاتب المشاركة : Islam Ibrahim

باستخدام الفئة WeakReference يمكننا بسهولة معرفة حالة الكائن المرتبط بها إن كان لازال متواجدا في الذاكرة أو قامت GC بجمعه والمثال التالي يوضح كيفية استخدام الخاصية IsAlive والتي تعيد قيمة من النوع Boolean , ولنفترض أننا قمنا بكتابة الفئة Book مسبقاً


كود :
Dim MyBook As New Book("My New Book","MyName")

Dim WR As New WeakReference(MyBook)
MyBook = Nothing
If WR.IsAlive Then
Console.WriteLine("My Book Is Alive")
Dim Book2 As Book = DirectCast(WK.Target, Book)
Console.WriteLine(Book2.Title)
Book2 = Nothing
Else
Console.WriteLine("My Book Is Dead")
End If

GC.Collect()

If WR.IsAlive then
Console.WriteLine("My Book Is alive")
Else
Console.WriteLine("My Book Is Dead")
End If
وسيكون الناتج في نافذة المخرجات ما يلي:


كود :
Book is alive
My New book
Book is dead
}}}
تم الشكر بواسطة:
#3
كاتب المشاركة : Islam Ibrahim

للفئة WeakReference منشِِئان Two constructors الأول يستقبل كائن من النوع Object والأخر قيمة TrackResurrection من النوع Boolean , عندما تكون هذه القيمة True هذا المرجع الضعيف سيبقى بعد استدعاء الإجراء Finalize للكائن Object الممرّر للمرجع.
}}}
تم الشكر بواسطة:
#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 من الوصول إلى الكائن وجمعه.
}}}
تم الشكر بواسطة:
#5
كاتب المشاركة : samerselo

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

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 ( _
info As SerializationInfo, _
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 وهو محجوز ولا يقوم بأي دور حاليا في العملية
}}}
تم الشكر بواسطة:
#6
كاتب المشاركة : samerselo

عناصر الفئة
الطرائق
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
}}}
تم الشكر بواسطة:
#7
كاتب المشاركة : samerselo

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)
}}}
تم الشكر بواسطة:
#8
كاتب المشاركة : Islam Ibrahim

سأحاول فيما يلي إضافة بعض الأمثلة عن كيفية استخدام الفئة WeakReference بشكل عملي في تطبيقاتنا

هذا مثال بسيط عبارة عن فئة تقوم بحفظ عناصر الصور داخل ال Cache


كود :
Public Class ImageCache
Private _cache As IDictionary(Of String, WeakReference) = New Dictionary(Of String, WeakReference)()
Public Function GetImage(ByVal path As String) As Image
Dim reference As WeakReference
If _cache.TryGetValue(path, reference) Then
If reference.IsAlive Then
Return DirectCast(reference.Target, Image)
Else
' image has been garbage collected
' remove reference from cache
_cache.Remove(path)
End If
End If

' not in cache, so load
Dim image__1 As Image = Image.FromFile(path)
reference = New WeakReference(image__1)
_cache.Add(path, reference)
Return image__1
End Function
End Class
هذا مثال آخر عن كيفية قراءة بيانات XML من ملف XML معين


كود :
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Xml

Public Class Program
Sub Main(ByVal args As String())

Dim cacheFile As New CacheXmlDocument("UIConfig.xml")
Console.WriteLine(cacheFile.GetXml())

Console.WriteLine(cacheFile.GetXml())

Console.Read()
End Sub
End Class

Public Class CacheXmlDocument

Public ReadOnly FileName As String
Private wrText As WeakReference

Public Sub New(ByVal fileName__1 As String)
FileName = fileName__1
End Sub

Private Function ReadXml() As String
'load the xml document
Dim xmlDoc As New XmlDocument()
xmlDoc.Load(FileName)
Dim xml As String = xmlDoc.InnerXml

'create the weak reference
wrText = New WeakReference(xml)
Return xml
End Function

Public Function GetXml() As String
Dim text As Object = Nothing


'you may also use wrText.IsAlive to check it has been GC'ed
If wrText IsNot Nothing Then
text = wrText.Target
End If


If text IsNot Nothing Then
Return text.ToString()
Else
Return ReadXml()
End If
End Function
End Class
}}}
تم الشكر بواسطة:



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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم