2016-12-07 30 views
-2

我必须从另一个类中的事件访问数据。 在该类事情是这样的:从c#事件中检索数据

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); 
     }; 

但它似乎没有工作。

谢谢你的帮助。

编辑: 它编译没有错误,但没有打印在控制台上。我不知道如何检查事件是否已经升高。

+4

_doesn't似乎work_不会给我们任何信息。该事件是否被解雇? 'e'属性是否为空?它会抛出任何异常吗? – Pikoh

+1

它如何不起作用?你在哪里分配可变数据包? – MacakM

+2

请详细说明“不工作” - 任何编译器错误,任何运行时错误,意外的行为? –

回答

0

那么这个我读我创建了一个平常的事件,会给你一些数据访问。

我们从创建活动开始。

public delegate void PacketReceivedEventHandler(var pPacket); 
    public event PacketReceivedEventHandler PacketReceived; 

我把一个var放在那里,因为我没有看到你是什么“交付”。只要把它改成你需要的任何东西。

那么,让我们继续。当事件需要被触发时放置它。

if (Mavlink.PacketReceived != null) 
    Mavlink.PacketReceived(YourPackage);  

YourPackage是你要提供什么。

但是你需要订阅一个事件来做它的东西。

Mavlink.PacketReceived += Mavlink_PacketReceived; 

如果您在+ =后双击tab,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); 
     } 
    } 

我不知道以后,在你的代码会发生什么,但要确保会有一些让你命令排队等待,因此烧制,经过近习惯。

+0

好吧,我的错误是订阅事件后触发。感谢您帮助我理解。现在它可以工作。 – user2833876

+0

@ user2833876高兴地帮助:) – Cataklysim

0

我做了一个例子,它工作正常,希望它有帮助。你PacketRecievedEventHandler替换事件处理程序:

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()); }; 
    } 
} 

}