تقييم الموضوع :
  • 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]
}}}
تم الشكر بواسطة:


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


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


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