05-10-12, 01:22 AM
كاتب الموضوع : samerselo
رجاء حار أريد أن يكون هذا الموضوع للنقاش العلمي حصرا يرجى عدم طرح مشاركات شكر أريد مشاركات نقاش حول هذا الموضوع فقطسأبتدئ هذا الموضوع بهذه الفقرة المترجمة من مكتبة MSDN للتعريف بهذه الفئة
تمثل الفئة WeakReference مرجعا ضعيفا يؤشر إلى غرض Object مع إبقاء تمكين جامع النفايات من التعامل معه وهي موجودة ضمن مجال الأسماء System في المجمع mscorlib.dll والتصريح عنها يأتي كما يلي
<SerializableAttribute> <ComVisibleAttribute(True)> _
<SecurityPermissionAttribute(SecurityAction.Inheri tanceDemand, Flags := SecurityPermissionFlag.UnmanagedCode)> _
Public Class WeakReference _
Implements ISerializable
<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]