2011-08-06 3 views
1

私は単純なクライアントサーバーアプリケーションを書いています。クライアント側では、クラスとのすべての通信を行うためのクラスのシングルトンインスタンスを設定しました。 新しいメッセージが届くと、それらをコレクションに格納してからイベントを開始します。開いており、イベント に登録されているフォームは、メッセージを受信して​​処理します。リストを読み込んでイベントに登録する適切な方法

私の問題は、メッセージを受信した後にフォームが開くと、以前に受信したメッセージをどのように送信し、メッセージを紛失したり、2回受け取ることなく新しいメッセージを受信するのですか?

フォームのコード

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(); 
} 

編集:私は、私は自分自身を十分説明と思ういけません。私はすでに受け取ったすべてのメッセージを保管しています。私が懸念しているのは、メッセージをロードしてイベントに登録するときに、私が逃すことのできる新しいメッセージが入るということです。または、イベントに最初に登録してからメッセージを読み込むと、メッセージを2回受け取ることができます。

+0

タイトルに「C#」などのプレフィックスを付けないでください。それが私たちがタグを持っているものです。 –

+0

以前に受信したメッセージをどこかに格納します。あなたのメインフォームまたは別のクラスなど。 –

答えて

1

すでに言及したように、以前に受信したメッセージを格納します。

さらに、MsgReceivedイベントにプロパティを使用できます。プロパティの「追加」部分には、以前のメッセージのために追加されたデリゲートを呼び出すことができます。

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

     ... 
    } 
    remove 
    { 
     ... 
    } 
} 
関連する問題