正确加载列表和订阅事件的方法

时间:2011-08-06 16:22:04

标签: c# event-handling

我正在编写一个简单的客户端服务器应用在客户端,我设置了一个类的单例实例来与服务器进行所有通信。 当新消息进入时,我将它们存储在一个集合中,然后触发一个事件。任何已打开并订阅该活动的表单 然后会收到消息并进行处理。

我的问题是,如果在收到邮件后打开表单,我该如何发送以前收到的邮件并订阅 新的没有丢失任何消息,或得到一次?

表格代码

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

编辑:我不认为我解释得很好。我已经存储了收到的所有消息。我担心的是,在我加载消息和订阅事件之间,我会想念一条新消息。或者,如果我首先订阅该事件然后加载消息,那么我最终可能会收到两次消息。

1 个答案:

答案 0 :(得分:1)

汉斯已经提到:存储以前收到的消息。

另外,您可以使用MsgReceived事件的属性。在属性的“添加”部分,您可以为之前的任何消息调用添加的委托。

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

        ...
    }
    remove
    {
        ...
    }
}