c# - 通过事件传递数据

标签 c# events

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

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

在“发送方”端(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 时被覆盖。

在“接收器/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.CommTextBox("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);
}

在“接收器/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), new object[] { sender, e});
    }
    else
    {
        frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n", Color.Red);
    }
}

最佳答案

您可以将数据存储在自定义 EventArgs 类中:

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

事件定义如下:

public event EventHandler<ReceivedDataEventArgs> ReceivedData;

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

关于c# - 通过事件传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13455047/

相关文章:

c# - 如何使用带有 c#.net 1.1 版的 asp.net 在 rtf 文件中插入分页符?

java - 如何在按钮单击java时显式触发按键事件

javascript - 让事件处理程序忽略子项

javascript - 传递给 .click() 方法参数的参数是否始终是 Event 对象?

c# - Scala (2.8)/Lift (2.2) 与 C# (4.0)/ASP.NET-MVC 3

c# - BasicPublish() 的可靠性如何?

c# - 文本框显示格式

c# - 如何使用反射找到特定的通用重载?

wcf - PRISM 和 WCF - 他们玩得好吗?

javascript - sitefinity 6 - 事件模块错误javascript