从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乐意帮忙:)