c# – 使用事件传递数据

前端之家收集整理的这篇文章主要介绍了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.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);
}

在’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.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#相关文章