2011-08-06 2 views
1

간단한 클라이언트 서버 응용 프로그램을 작성하는 중입니다. 클라이언트 측에서는 서버와의 모든 통신을 수행하기 위해 클래스의 싱글 톤 인스턴스를 설정했습니다. 새 메시지가 들어 오면 컬렉션에 저장 한 다음 이벤트를 시작합니다. 열린 상태이고 이벤트 에 가입 한 양식은 메시지를 수신하고 처리합니다.목록을로드하고 이벤트에 등록하는 적절한 방법

내 문제는 메시지를받은 후 양식을 열면 이전에받은 메시지를 보내고 메시지를 누락하거나 두 번 가져 오지 않고 새로운 메시지를 구독하는 방법입니다.

양식 코드

private void Form_Load(object sender, EventArgs e) 
{ 
     handleMsgRec = new EventHandler<MsgEventArgs>(MsgReceived);   

     Comm.Instance.LoadMsgs(Msgs); 

     Comm.Instance.MsgReceived += handleMsgRec; 
} 

서버 통신 코드

private static ReaderWriterLockSlim rw = new ReaderWriterLockSlim(); 

public void LoadMsgs(List<MsgObject> msgs) 
{ 
     rw.EnterReadLock(); 
     Messages.ForEach(f => msgs.Add(f)); 
     rw.ExitReadLock(); 
} 

편집 : 나는 나 자신을 충분히 설명 같아요. 이미받은 모든 메시지를 저장하고 있습니다. 내 관심사는 내가 메시지를로드하고 이벤트에 가입 할 때까지 내가 놓칠 새로운 메시지가 들어올 수 있다는 것이다. 또는 먼저 이벤트에 가입 한 다음 메시지를로드하면 메시지를 두 번받을 수 있습니다.

+0

"C#"과 같이 제목 앞에 접두사를 사용하지 마십시오. 그것이 우리가 태그를 가지고있는 것입니다. –

+0

이전에받은 메시지를 어딘가에 저장하십시오. 귀하의 메인 폼 또는 별도의 클래스 예를 들어. –

답변

1

한스가 이미 언급했듯이 : 이전에받은 메시지를 저장하십시오.

또한 MsgReceived 이벤트에 대한 속성을 사용할 수 있습니다. 속성의 "add"부분에서 이전 메시지에 대해 추가 된 대리자를 호출 할 수 있습니다.

public event EventHandler<MsgEventArgs> MsgReceived 
{ 
    add 
    { 
     foreach (MsgObject mo in msgs) 
      value(this, new MsgEventArgs() { Message = mo }); 

     ... 
    } 
    remove 
    { 
     ... 
    } 
} 
관련 문제