我需要传递一个事件的数据.目前,当接收到更多数据(通过comport)时,事件将触发,但是前一个事件(& data)尚未被处理,所以数据被覆盖.
如何以安全的方式处理事件和数据?我有这样的多个事件(15x),所以我不知道如果使用队列的数据是最好的方式或传递数据与事件(像S.O.项目4215845).
如何以安全的方式处理事件和数据?我有这样的多个事件(15x),所以我不知道如果使用队列的数据是最好的方式或传递数据与事件(像S.O.项目4215845).
示例(这个例子是一个字符串,但是我也使用数组,bools等):@H_502_4@
在“发件人”端(class1):@H_502_4@
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被触发太快时被覆盖.@H_502_4@
在’receiver / GUI’端(class2):@H_502_4@
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不包含预期数据(以前的数据),但所有事件都是“接收到的”.@H_502_4@
你的帮助非常感谢!更多的例子!@H_502_4@
编辑:@H_502_4@
在“发件人”端(class1):@H_502_4@
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); }
…@H_502_4@
private void PrepareDataAndFireEvent() { DiaStringEventArgs args = new DiaStringEventArgs(); args.DiaString = ByteToString(data); evDiaStringMessageEvent(args); }
在’receiver / GUI’端(class2):@H_502_4@
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),e}); } else { frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n",Color.Red); } }