C# · 12月 26, 2021

c# – 使用事件传递数据

我需要传递一个事件的数据.目前,当接收到更多数据(通过comport)时,事件将触发,但是前一个事件(& data)尚未被处理,所以数据被覆盖.
如何以安全的方式处理事件和数据?我有这样的多个事件(15x),所以我不知道如果使用队列的数据是最好的方式或传递数据与事件(像S.O.项目4215845).

示例(这个例子是一个字符串,但是我也使用数组,bools等):

在“发件人”端(class1):

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被触发太快时被覆盖.

在’receiver / GUI’端(class2):

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.CommText@R_284_2419@(“Receiver message: ” + dia.DiaString + “\r\n”,Color.Red); }}

dia.DiaString不包含预期数据(以前的数据),但所有事件都是“接收到的”.

你的帮助非常感谢!更多的例子!

编辑:

我把代码改成了

在“发件人”端(class1):

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);}

在’receiver / GUI’端(class2):

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.CommText@R_284_2419@(“Receiver message: ” + e.DiaString + “\r\n”,Color.Red); }}解决方法 您可以将数据存储在自定义的EventArgs类中: public class ReceivedDataEventArgs : EventArgs{ // Add the properties you require}

事件定义如下:

public event EventHandler<ReceivedDataEventArgs> ReceivedData;

您的处理程序将采用一个实例,而不是EventArgs对象,因此您将拥有正确的数据.