Подтвердить что ты не робот

Передача данных с событиями

Мне нужно передать данные с событием. В настоящее время при получении большего количества данных (через comport) событие срабатывает, но предыдущее событие (& data) еще не обрабатывается, поэтому данные переписываются.
Как я могу безопасно обрабатывать данные события и У меня есть несколько событий, подобных этому (15x), поэтому я не уверен, что использование очереди для данных - лучший способ или передача данных вместе с событием (например, пункт S.O. 4215845).

Пример (этот пример со строкой, но я также использую массивы, bools и т.д.):

На стороне 'отправителя' (класс1):

public event EventHandler evDiaStringMessage = delegate { };
private void evDiaStringMessageEvent()
{
    evDiaStringMessage(this, new EventArgs());
}
private static string _DiaString;
public string DiaString
{
    get { return _DiaString; }
    set { _DiaString = value; }
}

DiaString содержит данные и перезаписывается, когда evDiaStringMessage запускается слишком рано.

На стороне приемника /GUI (класс2):

dia.evDiaStringMessage += new EventHandler(dia_evDiaStringMessage);

private delegate void dia_evDiaStringMessageCallBack(object sender, EventArgs e);
void dia_evDiaStringMessage(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
    }
    else
    {
        frmcomm.CommTextBox("Receiver message: " + dia.DiaString + "\r\n", Color.Red);
    }
}

dia.DiaString не содержит ожидаемых данных (предыдущие данные), но все события "получены".

Ваша помощь очень ценится! Еще больше с примером!

Edit:

Я изменил код на:

На стороне 'отправителя' (класс1):

public event EventHandler<DiaStringEventArgs> evDiaStringMessage ;
public class DiaStringEventArgs : EventArgs
{
    public string DiaString  { get; set; }
}

private void evDiaStringMessageEvent(DiaStringEventArgs e)
{
    EventHandler<DiaStringEventArgs> handler = evDiaStringMessage;
    if (handler != null)
        handler(this, e);
}

...

private void PrepareDataAndFireEvent()
{
    DiaStringEventArgs args = new DiaStringEventArgs(); 
    args.DiaString = ByteToString(data);
    evDiaStringMessageEvent(args);
}

На стороне приемника /GUI (класс2):

dia.evDiaStringMessage += new EventHandler<ifDiA10.DiaStringEventArgs>(dia_evDiaStringMessage);

private delegate void dia_evDiaStringMessageCallBack(object sender, ifDiA10.DiaStringEventArgs e);
void dia_evDiaStringMessage(object sender, ifDiA10.DiaStringEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
    }
    else
    {
        frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n", Color.Red);
    }
}
4b9b3361

Ответ 1

Вы можете хранить свои данные в пользовательском классе EventArgs:

public class ReceivedDataEventArgs : EventArgs
{
   // Add the properties you require
}

Событие определяется следующим образом:

public event EventHandler<ReceivedDataEventArgs> ReceivedData;

Ваш обработчик возьмет экземпляр вашего класса вместо объекта EventArgs, и, следовательно, вы получите правильные данные.

Ответ 2

Вы должны передать значение dia.DiaString, когда событие будет возбуждено, а не читать его при обработке события.

Вы можете сделать это, расширив класс EventArgs и создав пользовательские свойства.

Если вам нужен пример, дайте мне знать.