문제

GUI가 컬렉션의 변경에 응답 할 수있는 다음 코드가 있습니다.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

우선 이것이 이것을하는 좋은 방법입니까?

둘째 :이 이벤트에서 구독을 취소 할 코드는 무엇입니까? 동일하지만 -= (그리고 완전한 익명 메소드)가 동일합니까?

도움이 되었습니까?

해결책

이벤트에서 구독을 취소 해야하는 경우 instanced 참조가 필요합니다. 불행히도, 그것은 당신이 특정 구문을 사용할 수 없다는 것을 의미합니다.

다른 팁

우선 ... 예, 그 일을하는 좋은 방법입니다. 깨끗하고 작은 형태이며 읽기 쉽고 이해하기 쉽습니다 ... 물론 경고는 "나중에 구독을 취소하고 싶지 않다면"입니다.

나는 믿는다 존 스키트 그 전에 지적한 "사양은 익명의 방법으로 만든 대의원의 동등성과 관련하여 행동을 명시 적으로 보장하지 않는다"고 지적했다.

따라서 나중에 이벤트에서 구독을 취소 해야하는 경우 실제로는 대의원 인스턴스를 만들어 나중에 참조에 매달릴 수 있습니다.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

MyObservablecollection이 'this'보다 오래 살지 않는 한, 그것은 가기위한 괜찮은 방법입니다.이 경우 무대 뒤에서 만들어진 대의원이 당신의 '이것'에 대한 참조를 보존 할 수 있기 때문에 메모리 누출로 끝날 수 있습니다. 그것을 살리게 할 것입니다. 이벤트를 듣고있는 모든 것을 반복적으로 만들고 '파괴'한다면 쓰레기 수집가가 수집하지 않는다는 것을 알게 될 것입니다.

이것이 문제라면, 당신은 응답에서 제안 된 경로를 가서 핸들러에 대한 참조를 보존 할 수 있으며, 이는 먼저 만들어야합니다.

또 다른 해결책은 약한 참조를 사용하여 다른 참조가없는 경우 가입자를 수집 할 수있는 이벤트 핸들러를 작성하는 것입니다. 이 솔루션을 탐색했습니다 이 질문과 답변.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top