我正在编写一个简单的客户端服务器应用程序。在客户端,我设置了一个类的单例实例来与服务器进行所有通信。当新消息传入时,我将它们存储在一个集合中,然后触发一个事件。打开并订阅该事件的任何表单将接收该消息并对其进行处理。
我的问题是,如果收到消息后打开一个表单,我如何将之前收到的消息发送给它并订阅没有错过任何消息的新邮件,还是收到两次邮件?
形式代码
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();
}
我觉得我解释得不够好。我已经存储了我收到的所有消息。我担心的是,在加载消息和订阅事件之间,我可能会错过一条新消息,或者如果我先订阅事件然后加载消息,我可能会收到两次消息。
正如Hans已经提到的:存储先前收到的消息。
另外,你可以为MsgReceived事件使用一个属性。在属性的"add"部分,您可以为任何先前的消息调用已添加的委托。
public event EventHandler<MsgEventArgs> MsgReceived
{
add
{
foreach (MsgObject mo in msgs)
value(this, new MsgEventArgs() { Message = mo });
...
}
remove
{
...
}
}