2012-05-09 6 views
15

저는 WPF를 배우고 있으며 약한 이벤트의 개념을 우연히 발견했습니다.하지만 실제로 그것을 얻으려고 애를 쓰고 있습니다. I에 유래에 수많은 기사를 읽고 코드 샘플을 보았다 그러나 그것은 단지에 침몰되지 않은 여기 약한 이벤트는 어떻게 작동합니까?

내 딜레마 :.

  1. 본인은 오브젝트는 이벤트의 소스에 가입 할 때 이벤트는 구독자에 대한 참조를 보유해야합니다.
  2. 가입자가 범위를 벗어나거나 명시 적으로 소멸되었지만 이벤트 소스가 파기되지 않으면 이벤트 소스가 여전히 구독자에 대한 참조를 유지하기 때문에 구독자가 가비지 수집되지 않는다는 것도 알고 있습니다.
  3. 이 문제를 피하는 일반적인 방법은 개체가 소멸되기 전에 구독자를 원본에서 명시 적으로 구독 취소하는 것입니다. 나는 이것이 프로그래머가 언제 일어날지를 결정할 수 없다면 이것이 문제가 될 수 있음을 이해한다.

위의 내용에서 이벤트를 사용하면 메모리 누수가 발생할 수있는 이유와 약한 참조 패턴이 필요한 이유를 이해할 수 있지만 약한 이벤트 패턴이 실제로 어떻게이 목표를 달성 할 수 있는지 이해하고 있습니다. ? 다르게 무엇을합니까?

이벤트를 관리하는 클래스가 있어도 핸들러를 소스에 등록/등록 취소해야하므로 반드시 이벤트가 사용되는 표준 방법에 동일한 문제가있는 참조가 있어야합니다.

누군가 나에게 기본 개념이 무엇인지 설명해주십시오. 나는 실종되었거나 오해하고있어 약한 사건 패턴을 '도출'하도록 도와줍니다.

답변

16

누락 된 부분은 약식 이벤트 (커버 아래의 Weak References을 사용하며 차례로 GCHandle 사용)가 강력한 참조가없는 개체에 액세스해야하는 특정 경우에 기본 제공 CLR 동작을 활용하고 있다는 것입니다. 즉, 응용 프로그램 코드가 적용되는 정상적인 "규칙"에 의해 제약받지 않습니다.

은 WeakEventManager 이벤트 가입자에게 약한 참조를 들고, 뒤에서는

http://sankarsan.wordpress.com/2008/08/09/weak-references/를 참조하십시오. 이벤트가 발생하기 전에 구독자가 GC로 처리되면 WeakEventManager는 "괜찮습니다. 그 사람은 죽었습니다. 지금부터이 이벤트를 알려 드리려고합니다."

+0

@ ChrisSinclair 링크가 다운되었습니다 : ( – SuperJMN

+1

@SuperJMN : 감사합니다. 다음은 업데이트 된 링크입니다. https://bkiener.wordpress.com/2010/02/11/simple-weak-event-listener-for-silverlight/ –

관련 문제