2012-10-01 4 views
1

클래스에 viewmode 클래스 mvvm이 있다고 가정 해 보겠습니다. 그런 다음이 VM 용으로 만들어진 이벤트 핸들러가 있습니다. 다른 상황에서 다른 많은 사람들이 사용할 수 있습니다.이벤트 처리기를 감지하고 해제하는 방법은 무엇입니까?

그래서 myvm의 인스턴스가있는 경우, 이벤트 처리기가 연결되어 있고 메모리 문제로 해제하려고하는지 감지하고 싶습니다.

myvm에서이를 수행하는 일반적인 방법은 무엇입니까? 예를 들어, myvm 소스 코드가 없을 수 있습니다.

+0

릴리스하려는 이벤트 핸들러 또는 myvm은 무엇입니까? – CrazyCasta

답변

2

이벤트는 선언 된 클래스 외부의 코드가 기본 대리자에 액세스 할 수 없도록 디자인되었습니다. 예를 들어, C# Language specification (강조 광산)의 "10.8 이벤트"절에있어서, 상기 형상의 동작

X +는 또는 X, Y = - X 이벤트 및 인 = Y는 기준 소요 x 선언이 포함 된 형식 외부에있는 경우 연산 결과에 void 형식이 있습니다 ( 할당 이후에 x 값을 가지며 과 반대). 이 규칙은 외부 코드가 이벤트의 기본 대리자를 간접적으로 검사하지 못하도록합니다 ( ).

따라서, 클래스가 "해결할"기껏 할 수 밖에 이벤트에 가입되어 무엇을 발견. 당신이 이벤트를 포함한 클래스의 소스에 액세스 할 수 있으며 당신이 event에 매여 대표의 트랙을 유지하려면

는, 이벤트 정의 및 manually keep track of them in a Dictionaryaddremove 키워드를 구현합니다.

0

나는 당신을 올바르게 이해합니다. 이 클래스는 설명하기 위해 SocketAsyncEventArgs를 사용하는 알려지지 않은 myvm 클래스를 래핑합니다. 물론 SocketAsyncEventArgs 클래스의 소스 코드가 없습니다.

그리고 SocketAsyncEventArgs 클래스의 Completed 이벤트를 래핑했습니다. 해당 이벤트가 트리거되면 _instance_Completed가 실행되고 _myvm 이벤트가 발생합니다. 그래서 우리가해야 할 일은 _myvm 이벤트를 구독/탈퇴하는 것입니다.

는 그럼 난/가입 탈퇴로, 대표 그러므로 당신이 호출 ClearEvents() 메소드에 의해 을 취소 할 수있는 목록에 저장되어, 가입하는 사람/탈퇴 _myvm 이벤트에 대한 이벤트를 둡니다.

희망이 있으면 도움이 될 것입니다.

public class WrapperClass 
    { 
     private EventHandler<SocketAsyncEventArgs> _myEvent; 
     private SocketAsyncEventArgs _myvm; 
     private List<Delegate> delegates; 

     public WrapperClass() 
     { 
      delegates = new List<Delegate>(); 
     } 

     public void SetInstance(SocketAsyncEventArgs myvm) 
     { 
      _myvm = myvm; 
      _myvm.Completed += new EventHandler<SocketAsyncEventArgs>(_instance_Completed); 
     } 

     private void _instance_Completed(object sender, SocketAsyncEventArgs e) 
     { 
      if (_myEvent != null) 
      { 
       _myEvent(sender, e); 
      } 
     } 

     public event EventHandler<SocketAsyncEventArgs> myEvent 
     { 
      add 
      { 
       delegates.Add(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Combine(_myEvent, value); 
      } 
      remove 
      { 
       delegates.Remove(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, value); 
      } 
     } 

     public void ClearEvents() 
     { 
      foreach (var d in delegates) 
      { 
      _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, d); 
      } 
     } 
    } 
관련 문제