Правильный способ загрузить список и подписаться на событие - PullRequest
1 голос
/ 06 августа 2011

Я пишу простое приложение клиент-сервер.На стороне клиента я установил одноэлементный экземпляр класса, чтобы сделать все взаимодействие с сервером.Когда приходят новые сообщения, я сохраняю их в коллекции, а затем запускаю событие.Любые формы, которые открыты и подписаны на событие, затем получат сообщение и обработают его.

Моя проблема заключается в том, что если форма открывается после получения сообщений, как я могу отправить ей ранее полученные сообщения?и подписаться на новые, не пропуская ни одного сообщения, или получая одно дважды?

Код формы

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 Ответ

1 голос
/ 06 августа 2011

Как уже упоминал Ганс: сохраняйте ранее полученные сообщения.

Дополнительно вы можете использовать свойство для события MsgReceived.В части «add» свойства вы можете вызвать добавленного делегата для любых предыдущих сообщений.

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

        ...
    }
    remove
    {
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...