2012-06-12 2 views
3

IDisposable 또는 Finalizer 내에서 다음 패턴을 적용하려는 일부 이벤트가 기본 클래스에 있습니다.GetInvocationList를 사용하여 이벤트 핸들러 구독 취소

var onCategorizedMessage = this.OnCategorizedMessage.GetInvocationList().ToList(); 
foreach (var item in onCategorizedMessage) 
    this.OnCategorizedMessage -= item; 

이벤트 당 한 번이 코드를 반복합니다.

메모리 누수를 방지하기 위해 이벤트 수신 거부를 적절하고 견고하게 처리 할 수 ​​있습니까?

+1

많은 경우에 실제로 문제가 아닙니다. 생산자가 소비자를 벗어나려고합니까? –

+0

@BryanCrosby - 나도 몰라. HubTransport Agent를 만들고 있는데 호스팅 코드 내부에서 어떤 일이 일어날 지 모릅니다. http://msdn.microsoft.com/en-us/library/dd877026(v=exchg.140).aspx – LamonteCristo

+0

논리적으로 말하면 탈퇴가 탈퇴자 자체의 책임이라고 생각합니다. 그 외에는 폐기 할 때 호출 목록을 지우는 데 많은 포인트가 없습니다. 그러나 폐기 될 때 (수신 거부자가 보낸) 이벤트의 구독을 취소하는 큰 포인트가 있습니다 (폐기 된 개체의 메서드에 대한 대리자가있는 이벤트의 호출 목록을 방지하기 위해). – SimpleVar

답변

0
당신이 (대표를 저장) 후원 필드에 액세스 할 수 있기 때문에 for 또는 foreach를 사용하여 할 필요가 그냥 같이 할 필요가 없다

:

this.OnCategorizedMessage = null; 

을 할 수있는 자세한 내용은 여기에서 확인하십시오 : http://www.codeproject.com/Articles/864690/Simplifying-Events-in-NET