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

しかし、それは仕事をいないようです。

ありがとうございました。

編集: erroreなしでコンパイルされますが、コンソールに何も表示されません。私はイベントが起きたかどうかをチェックする方法を知らない。

+4

_働いているようではありません。私たちには何の情報も与えません。イベントは解雇されていませんか? '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; 

+#の後にタブを2重にすると、通常はクラスが作成されます。しかしここに私が作成したクラスがあります。

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でのEventHandlerを交換してください:この上まあ

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

}

関連する問題