2013-05-07 1 views
1

저는 아직이 기사에서 초보자입니다. 이벤트를보다 잘 이해하고 올바르게 사용하는 방법을 배우려고합니다.관리자 유형 클래스의 이벤트 등록

나는 한 무리의 객체를 저장하는 컨테이너가있는 관리자 클래스가 있습니다. 각 객체에는 이벤트가 있습니다 (본질적으로 그것이하는 일을 마쳤다고 말함). 이벤트가 발생하면 관리자 클래스에서 이벤트를 구독하고 컨테이너에서 객체를 제거하고 싶습니다.

개체의 이벤트에 등록 할 때 해당 개체의 모든 인스턴스에 등록 되는가, 아니면 인스턴스에 특정한 것입니까? 그래서 여기

이의 종류 내가보고있는 무슨 :

class MyManager 
{ 
    private ConcurrentDictionary<string, MyObject> m_myObjectCollection; 

    public MyManager() 
    { 
     m_myObjectCollection = new ConcurrentDictionary<string, MyObject>(); 


    } 


    private void RemoveObject(MyObject myObject) 
    { 
     //remove object from collection 
    } 
} 


class MyObject 
{  

    public delegate void MyObjectFinished_EventHandler(object source, EventArgs e); 

    public event MyObjectFinished_EventHandler OnFinished; 

    public MyObject() 
    { 

     this.OnFinished += new MyObjectFinished_EventHandler(MyObject_OnFinished); 

    } 

    private void MyObject_OnFinished(object source, EventArgs e) 
    { 
     //do some clean up stuff 
    } 

    private void DoStuff() 
    { 
     //do stuff until finished 
     OnFinished(this, new EventArgs()); 
    } 

는 관리자 클래스는 MyObject를의 인스턴스를 만든 다음 해당 개체의 이벤트에 등록하도록 충분히 있습니까? 그건 나에게 맞는 것 같지 않다. 내 본능은 내가 그 객체의 사건에 대해서만 등록 될 것이고, 그 객체 유형의 모든 인스턴스가 아니라고 말하고있다.

또는 컬렉션에 추가 할 때마다 각 MyObject에 등록해야합니다. 그리고 제거 될 때 등록 해제해야합니까?

또는이 모든 것을 더 잘 처리 할 수있는 방법이 있습니까?

답변

0

당신은 이미 답을 가지고 : 당신이 MyManager에서 생성을 MyObject의 각 인스턴스에 대한 MyObjectFinished_EventHandler을 처리하는 함수를 등록해야합니다 :

private void CreateObjects() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     MyObject o = new MyObject(); 
     o.OnFinished += OnMyObjectFinished; 
     m_myObjectCollection.TryAdd(i.ToString(), o); 
    } 
} 

핸들러는 다음과 같이 보일 것이다 :

private void OnMyObjectFinished(object source, EventArgs e) 
{ 
    MyObject o = (MyObject)source; 
    RemoveObject(o); 
} 

보시다시피 소스를 MyObject 참조로 캐스팅 한 다음 필요에 따라 소스를 사용합니다.

편집 : 한 가지 더 명확히하기 위해 OnFinished 이벤트에 가입하여 MyObject 클래스의 정리 함수를 호출했습니다. 그 작동하지만, 간단한 것은 단지 DoStuff()에 직접 정리 함수를 호출하는 것입니다 :

public delegate void MyObjectFinished_EventHandler(object source, EventArgs e); 

    public event MyObjectFinished_EventHandler OnFinished; 

    public MyObject() 
    { 
    } 

    private void Finished() 
    { 
     //do some clean up stuff 
    } 

    public void DoStuff() 
    { 
     //do stuff until finished 
     Finished(); 
     OnFinished(this, new EventArgs()); 
    } 

이벤트는 일반적으로 일이 일어난 것을 다른 사람 (다른 개체)를 신호하는 데 사용됩니다.

+0

나는 그럴 것이라고 생각했다. 나를 위해 그것을 명확히하기 위해 시간을내어 주셔서 대단히 감사합니다! – Blau

0

개체의 이벤트에 등록 할 때 해당 개체의 모든 인스턴스에 등록되어 있습니까?

예, 귀하의 경우에는 constructor.so 내의 모든 객체 인스턴스에 이벤트를 연결하므로 모든 인스턴스에서 이벤트를 사용할 수 있습니다.

개체의 모든 인스턴스에 대해 새 이벤트/대리인 개체가 만들어집니다. 나는 그것이 컬렉션에 추가 한 다음에 등록을 취소가 제거 될 때 각 MyObject를 등록 할 필요가

또는인가?

이미 이벤트를 새로 생성 된 객체 인스턴스에 연결하여이 작업을 수행하고 있습니다. 각 개체에서 이벤트를 수동으로 제거 할 수있는 방법이 있거나 그냥 가비지 수집기에 남겨두면 작업을 수행 할 수 있습니다. 이벤트 개체는 사용중인 개체가 메모리에 있거나 가비지가 아닌 한 계속 살 수 있습니다 모은.