Мне нужно передать данные с событием. В настоящее время при получении большего количества данных (через 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);
}
}