2016-12-07 68 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()); }; 
    } 
} 

}