05-10-12, 11:46 AM
كاتب المشاركة : Islam Ibrahim
جزاك الله خيراً مهندس عمر,لكن لي تعليقان:
أولاً: لا أرى ضرورة لعمل Disposing للـ EventHandler الخاص بالحدث الذي أضفناه وأعتقد أن هذه العملية لا تقع على عاتق ال Control أو Component الذي نعمل على بنائه , ولكن تقع على عاتق ال Form أو ال Container الذي يستضيف ال Control الخاص بنا فهو الذي سيقوم بعمل Subscribing لل EventHandler وهو من يفترض أن يقوم بعمل العملية العكسية وهي Unsubscribing .
والسبب أن ال EventHandler لا يخص الكلاس الخاص بنا وليس أحد ال Members الخاص به بل يخص كما قلت ال Container الخاص بالكلاس سواء كان Form أو غيره. وهذا ال Container هو الذي سيتولى هذه المهمة نيابة عنا.
ثانياً: فإنه ينصح بعمل Lock عند إضافة أو إزالة أو إطلاق أي Eventhandler وذلك حتى نتفادى أي تضارب عندما يتم بإضافة نفس الحدث أو إزالته في نفس الوقت من أكثر من مسار واحد Thread وجعل مسار واحد فقط هو الذي يطلق الحدث في حين تنتظر البقية حتى ينتهي المسار الحالي, كما يوضّح المثال التالي:
كود :
Public Class ComponentTest
Inherits System.ComponentModel.Component
Public Sub New()
End Sub
Dim PropertyChangedObject As New Object()
Private m_color As Color = Color.Transparent
Public Property MyColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Empty
End If
Me.m_color = value
Me.OnPropertyChanged(Me, EventArgs.Empty)
End Set
End Property
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
MyBase.Dispose(disposing)
End Sub
Protected Overridable Sub OnPropertyChanged(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent PropertyChanged(sender, e)
End Sub
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
SyncLock PropertyChangedObject
Me.Events.AddHandler(PropertyChangedObject, value)
End SyncLock
End AddHandler
RemoveHandler(ByVal value As EventHandler)
SyncLock PropertyChangedObject
Me.Events.RemoveHandler(PropertyChangedObject, value)
End SyncLock
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = Nothing
SyncLock PropertyChangedObject
handler = CType(Me.Events(PropertyChangedObject), EventHandler))
End SyncLock
If handler IsNot Nothing Then
handler.Invoke(sender, e)
End If
End RaiseEvent
End Event
End Class