使用事件传递数据

时间:2012-11-19 13:42:20

标签: c# events

我需要通过事件传递数据。目前,当接收到更多数据(通过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过早触发时被覆盖。

在'接收器/ 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);
}

在&#39;接收器/ GUI&#39;方(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);
    }
}

2 个答案:

答案 0 :(得分:17)

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

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

事件定义如下:

public event EventHandler<ReceivedDataEventArgs> ReceivedData;

您的处理程序将接受您的类而不是EventArgs对象的实例,因此您将获得正确的数据。

答案 1 :(得分:2)

您应该在引发事件时传递dia.DiaString的值,而不是在处理事件时将其读回。

您可以通过扩展EventArgs类并创建自定义属性来实现此目的。

如果您需要一个例子,请告诉我。