从c#事件检索数据

从c#事件检索数据,c#,C#,我必须从另一个类中的事件访问数据。 在那门课上,事情是这样的: namespace MavLink { public class Mavlink { ... public event PacketReceivedEventHandler PacketReceived; ... private void ProcessPacketBytes(byte[] packetBytes, byte rxPacketSequenc

我必须从另一个类中的事件访问数据。 在那门课上,事情是这样的:

namespace MavLink
{
   public class Mavlink
    {
        ...
        public event PacketReceivedEventHandler PacketReceived;
        ...
        private void ProcessPacketBytes(byte[] packetBytes, byte rxPacketSequence)
        {
            ...
            if (PacketReceived != null)
            {
                PacketReceived(this, packet);
            }
            ...
        }

    }

    public delegate void PacketReceivedEventHandler(object sender, MavlinkPacket e);
}
        ...
        m.ParseBytes(newlyReceived);

        m.PacketReceived += (sender, e) => {
            Console.WriteLine(e.SystemId);
            Console.WriteLine(e.ComponentId);
            Console.WriteLine(e.SequenceNumber);
            Console.WriteLine(e.TimeStamp);
            Console.WriteLine(e.Message);
        };
大体上,我试着这样做:

namespace MavLink
{
   public class Mavlink
    {
        ...
        public event PacketReceivedEventHandler PacketReceived;
        ...
        private void ProcessPacketBytes(byte[] packetBytes, byte rxPacketSequence)
        {
            ...
            if (PacketReceived != null)
            {
                PacketReceived(this, packet);
            }
            ...
        }

    }

    public delegate void PacketReceivedEventHandler(object sender, MavlinkPacket e);
}
        ...
        m.ParseBytes(newlyReceived);

        m.PacketReceived += (sender, e) => {
            Console.WriteLine(e.SystemId);
            Console.WriteLine(e.ComponentId);
            Console.WriteLine(e.SequenceNumber);
            Console.WriteLine(e.TimeStamp);
            Console.WriteLine(e.Message);
        };
但它似乎不起作用

谢谢你的帮助

编辑:
它编译时没有错误,但控制台上没有打印任何内容。但我不知道如何检查事件是否已经发生。

我举了一个例子,效果很好,希望能有所帮助。将EventHandler替换为您的PacketReceivedEventHandler:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication
{
class Program
{
    static void Main(string[] args)
    {
        var sender = new Sender();
        var reciever = new Reciever(sender);
        sender.ProcessPacketBytes(null, byte.MaxValue);
        Console.ReadLine();
    }
}

/// <summary></summary>
public class Sender
{
    private readonly object _objectLock = new object();

    public event EventHandler PacketReceived
    {
        add
        {
            lock (_objectLock)
            {
                PacketRecievedEvent += value;
            }
        }

        remove
        {
            lock (_objectLock)
            {
                PacketRecievedEvent -= value;
            }
        }
    }

    private event EventHandler PacketRecievedEvent;


    public void ProcessPacketBytes(byte[] packetBytes, byte rxPacketSequence)
    {
        EventHandler handler = this.PacketRecievedEvent;
        if (handler != null)
        {
            handler(this, new EventArgs());
        }
    }
}

public class Reciever
{
    public Reciever(Sender sendertest)
    {
        sendertest.PacketReceived += (sender, e) =>
        { Console.WriteLine(e.GetType()); };
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序
{
班级计划
{
静态void Main(字符串[]参数)
{
var sender=new sender();
var接收器=新接收器(发送器);
sender.ProcessPacketBytes(null,byte.MaxValue);
Console.ReadLine();
}
}
/// 
公共类发送器
{
私有只读对象_objectLock=new object();
已收到公共事件处理程序包
{
添加
{
锁(_objectLock)
{
packetreceivedevent+=值;
}
}
去除
{
锁(_objectLock)
{
packetreceivedevent-=值;
}
}
}
私有事件处理程序包ReceivedEvent;
public void ProcessPacketBytes(字节[]packetBytes,字节rxPacketSequence)
{
EventHandler=this.packetreceivedevent;
if(处理程序!=null)
{
处理程序(这是新的EventArgs());
}
}
}
公共类接收器
{
公用接收器(发送器发送器测试)
{
sendertest.PacketReceived+=(发件人,e)=>
{Console.WriteLine(e.GetType());};
}
}

}

在我读到的这篇文章中,我创建了一个常规事件,它将为您提供一些可访问的数据

我们从创建事件开始

    public delegate void PacketReceivedEventHandler(var pPacket);
    public event PacketReceivedEventHandler PacketReceived;
我在那里放了一个var,因为我没有确切地看到您正在“交付”什么。只要把它换成你需要的东西

所以,让我们继续。在需要触发事件时放置此按钮

if (Mavlink.PacketReceived != null)
    Mavlink.PacketReceived(YourPackage);    
你的包裹就是你想送的东西

但是你需要订阅一个活动来处理它

Mavlink.PacketReceived += Mavlink_PacketReceived;
C#如果在+=”之后双击制表符,通常会创建一个类。但这是我创建的类

    private void Mavlink_PacketReceived(var pPacket)
    {
        if(pPacket != null)
        {
            Console.WriteLine(pPacket.SystemId);
            Console.WriteLine(pPacket.ComponentId);
            Console.WriteLine(pPacket.SequenceNumber);
            Console.WriteLine(pPacket.TimeStamp);
            Console.WriteLine(pPacket.Message);
        }
    }

我不知道您的代码中会出现什么,但请确保会有一些东西让您的命令行等待,这样它在启动后不会关闭。

似乎不起作用,但没有提供任何信息。事件是否未被触发?
e
属性是否为空?它会抛出异常吗?它怎么会不工作?在哪里分配变量包?请详细说明“不工作”-任何编译器错误、任何运行时错误、意外行为?您没有调用事件。(或显示调用它的部件)根据您的编辑判断。我认为应用程序比接收事件更快。好吧,我的错误是在事件触发后订阅了事件。谢谢你帮助我理解。现在它可以工作了。@user2833876乐意帮忙:)