2009-02-05 2 views
15

WindowsBase DLL 요약과 IWeakEventListener 이벤트를 정의 :WPF 응용 프로그램에서 사용되는 "약한 이벤트"패턴은 무엇입니까?

는 WeakEvent 패턴과 System.Windows.WeakEventManager을 통해 이벤트를 수신 할 것으로 예상 클래스에 대한 지원을 듣고 이벤트를 제공합니다.

이 막연한 설명은 '약한 행동 패턴'이 실제로 무엇인지 설명하지 않습니다.

이 패턴은 무엇이며, 왜 사용되며 WPF 응용 프로그램 외부에서 유용합니까?

EDIT 이미 좋은 답변이 있지만이 패턴이 WPF 응용 프로그램 외부에서 유용할지 여부는 아무도 없습니다. 종속성 속성과 같이 약한 이벤트 패턴은 WPF API 및 DLL과 밀접하게 연결되어있는 것으로 보입니다. 비 WPF 응용 프로그램에 사용할 수있는 동일한 구현이 있습니까?

+0

약한 참조가 문제에 대한보다 일반적인 접근 방법이며 WPF 외부에서 사용될 수 있다고 생각합니다. WeakEventManager는 WPF 이벤트 처리에 대한 약한 참조의 특수한 경우 인 것 같습니다. – Philippe

답변

23

중요한 비트 비고란에 : 이벤트 소스 리스너 이벤트 잠재적으로 독립적 인 객체의 수명을 갖는 경우

WeakEvent 패턴을 다음의 주요한 이유이다. 소스 객체가

을 지속되면 청취자의 핸들러를 WeakEventManager 의 중심 이벤트 파견을 허용 사용하면 '당신이 subscriberpublisher에 가입 한 후 정상적으로 후, publishersubscriber 개체가 그래서 경우에도 수집 가비지하기 s 이벤트 인 subscriber은 가비지 수집 될 수 없습니다. 약한 이벤트 패턴은이 종속성이 없도록 두 개의 "weak"(WeakReference에서와 같이) 사이의 연결을 만듭니다. (대안은 subscriber는 가비지 컬렉션 대상이되고 싶은 때 이벤트의 구독을 취소하는 것입니다,하지만 지저분한 얻을 수 있습니다.) 가입자가 수집되지 당할 수있는 이벤트를 구독

+1

정확히 어떻게 지저분 해 집니까? – zvolkov

+6

@ zvolkov : 갑자기 구독자가 가비지 수집 자격을 얻고 자 할 때 * 알아야 할 필요가 있기 때문에 종종 시스템 전체에 전파되는 추가 지식으로 끝날 수 있습니다. 갑자기 * 자동 * 가비지 컬렉션. –

+1

동의하지 않는 수신 거부 처리자는 지저분 해집니다. 그러나 "WeakReference"와 함께 약간의 오버 헤드가 있어야합니다! 내가 생각할 수있는 최소한의 것은 GC가 객체가 메모리에서 제거 될 때 약한 참조 객체를 null로 재설정해야하는 추가 작업입니다. –

10

WeakEvent Patterns

. 당신은 객체가 다른 참조를 가지고 있지 않을 때 수집된다고 가정 할 것입니다 - 그러나 이벤트 발행자는 리스너 객체를 보유하고 그것을 명시 적으로 구독 취소하지 않는 한 메모리에 유지합니다. 구독 취소). 관리 된 누출.

엄지 손가락 규칙에 따라 이벤트 게시자가 수신기보다 오래 동안 응답하지 않으면이 문제가 발생할 수 있으며이를 확인해야합니다.

WeakEvents는 활성 참조가 '약함'인 경우 개체가 수집된다는 점에서 여기서 도움이됩니다. 일반적으로 많은 이벤트를 노출하는 새 컨트롤을 개발하려는 경우에만이 패턴을 고려해야합니다.

기본 아이디어는 WeakReference w.r.t와 비슷합니다. 가비지 컬렉션.

5

.NET 4.5에는 이벤트에 대한 약한 참조 설정에 대한 지원이 개선되었습니다.Read more

+0

안녕하세요 Jowen, 당신은 4.5에 새로운 것이지만 3.0, 3.5, 4.0 및 4.5의 차이를 찾을 수 없다고 말하고 있습니까? 그게 뭔지 말해 줄 수 있어요? –

+0

링크가 끊어졌습니다 ... – Maxence

관련 문제