我正在编写一个简单的客户端服务器应用在客户端,我设置了一个类的单例实例来与服务器进行所有通信。 当新消息进入时,我将它们存储在一个集合中,然后触发一个事件。任何已打开并订阅该活动的表单 然后会收到消息并进行处理。
我的问题是,如果在收到邮件后打开表单,我该如何发送以前收到的邮件并订阅 新的没有丢失任何消息,或得到一次?
表格代码
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 :(得分:1)
汉斯已经提到:存储以前收到的消息。
另外,您可以使用MsgReceived事件的属性。在属性的“添加”部分,您可以为之前的任何消息调用添加的委托。
public event EventHandler<MsgEventArgs> MsgReceived
{
add
{
foreach (MsgObject mo in msgs)
value(this, new MsgEventArgs() { Message = mo });
...
}
remove
{
...
}
}