2011-03-22 1 views
3

어떻게 두 번 처리되는 이벤트를 방지 할이벤트 핸들러가 중복되지 않도록 하시겠습니까? (동일한 핸들러 경우?)

Module Module1 
    Sub Main() 
    Dim item As New Item 
    AddHandler item.TitleChanged, AddressOf Item_TitleChanged 
    AddHandler item.TitleChanged, AddressOf Item_TitleChanged 

    item.Title = "asdf" 

    Stop 
    End Sub 
    Private Sub Item_TitleChanged(sender As Object, e As EventArgs) 
    Console.WriteLine("Title changed!") 
    End Sub 
End Module 

Public Class Item 
    Private m_Title As String 
    Public Property Title() As String 
    Get 
     Return m_Title 
    End Get 
    Set(ByVal value As String) 
     m_Title = value 
     RaiseEvent TitleChanged(Me, EventArgs.Empty) 
    End Set 
    End Property 

    Public Event TitleChanged As EventHandler 
End Class 

는 출력 :

Title changed! 
Title changed! 

원하는 출력 :

Title changed! 

내가 이벤트를 원하는 관리자가이 이벤트가이 핸들러에 의해 이미 처리되었으므로이를 다시 처리하지 않아야 함을 감지합니다.

답변

0

HashSet에 이벤트 처리기 목록을 래핑하면 처리기가 중복 참조가 아닌지 확인하고, 질문의 Item 클래스에 대한 다음 스 니펫 대체가 위의 샘플에서 작동합니다 (처리기가 이미있는 경우 처리기를 다시 추가하지 않음).)이 HashSet에 :

Public Class Item 
    Private m_Title As String 
    Public Property Title() As String 
    Get 
     Return m_Title 
    End Get 
    Set(ByVal value As String) 
     m_Title = value 
     RaiseEvent TitleChanged(Me, EventArgs.Empty) 
    End Set 
    End Property 

    Private handlers As New HashSet(Of EventHandler) 

    Public Custom Event TitleChanged As EventHandler 
    AddHandler(value As EventHandler) 
     handlers.Add(value) 
    End AddHandler 

    RemoveHandler(value As EventHandler) 
     handlers.Remove(value) 
    End RemoveHandler 

    RaiseEvent(sender As Object, e As System.EventArgs) 
     For Each handler In handlers.Where(Function(h) h IsNot Nothing) 
     handler(sender, e) 
     Next 
    End RaiseEvent 
    End Event 
End Class 
+0

메모리 누수처럼 보입니다. –

6

또한 단지 항상 AddHandler 전에 RemoveHandler를 호출 할 수 있습니다. 특정 시나리오에서이 사실을 발견했습니다.

+1

비록 작동하지만 올바른 생각이 아닌 것 같습니다. – Shimmy

+0

이유를 설명하는 데주의해야합니까? – tenfour

+0

이벤트를 추가하기 전에 이벤트를 제거하는 것이 이상하게 들립니다. 그것은 나에게보기 싫은 것처럼 보인다. – Shimmy

관련 문제