2011-01-30 4 views
3

가 나는 TestEvent 클래스가 헬퍼 클래스에 의해 지정된 익명 필터 대표와의 앞쪽 해고되지 않았다. 그러나 내가 그렇게 그것을 구독한다면 :프리즘 CompositeEvent는

eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3)); 

그것은 '화재'. 개념적으로는 구문 론적으로나 논리적으로 모두 비슷합니다. 유일한 차이점은 첫 번째 이벤트가 이벤트 클래스에있는 헬퍼 메소드를 사용하여 이벤트에 가입한다는 것입니다.

이것은 가입 호출에서 keepSubscriberAlive = true (세 번째 인수)를 설정하면 첫 번째 함수가 작동하기 때문에 CompositeEvent 클래스가 보관하는 대리자에 대한 약한 참조와 관련된 것입니다. 내가 그 솔루션이 살아남을 것이라는 것을 모르기 때문에 나는 그 솔루션으로 갈 수 없다. 그 행사에 구독 한 수업이 될 것인가? 그렇다면 클래스는 false를 전달하지 않고도 살아있다. 왜 첫 번째 경우에 이벤트가 해고/처리되지 않는 것일까?

누구든지이 동작을 설명 할 수 있습니까?

답변

3

첫 번째 예제에서 코드는 TestEvent 메서드에 전달 된 변수를 캡처합니다. 이 경우 컴파일러는 숫자를 래핑하는 클래스를 만들어야합니다. 이 클래스의 새로운 인스턴스는 TestEvent의 Subscribe가 호출 될 때마다 인스턴스화되어야한다.

두 번째 예제에서는 캡처 할 데이터가 없으므로 Subscribe에 전달 된 대리자를 정적으로 만들 수 있습니다. 이 경우 도메인 언로드 전에 실행됩니다.