9

私は 1 つのライブラリ (DLL) を開発しています。このライブラリでは、データを含む 1 つのメソッドとしてユーザーにイベント (割り込み) を提供する必要があります。ライブラリの作業は、ソケットでリストを開始し、ソケットからデータを受け取り、このデータを 1 つのメソッドでユーザーに渡すことです。

としょうかん:

public void start(string IP, int port)
{
    // start logic...

    // receives data from socket... send this data to user

}

応用:

Library. Class a = new Library. Class();
a.start(ip, port);

// I need this method called by library automatically when it receives data...

void receivedData(string data)
{
    // data which received by library....
}

ライブラリからのデータを使用してアプリケーションにイベントを発生させる方法は?

前もって感謝します....

4

3 に答える 3

16

次のようにライブラリにイベントを追加します。

public event Action<string> OnDataReceived = null;

次に、アプリケーションで:

Library.Class a = new Library.Class();
a.OnDataReceived += receivedData;
a.start(ip, port);

それでおしまい。

しかし、慣習に従ってイベントを書きたいと思うかもしれません.NETはイベントをそのように使用しているので、慣習にぶつかるといつでもそれがイベントであることがわかります.NETはそれに慣れることをお勧めします. したがって、コードを少しリファクタリングすると、次のようになります。

クラス ライブラリで:

//...
public class YourEventArgs : EventArgs
{
   public string Data { get; set; }
}
//...

public event EventHandler DataReceived = null;
...
protected override OnDataReceived(object sender, YourEventArgs e)
{
   if(DataReceived != null)
   {
      DataReceived(this, new YourEventArgs { Data = "data to pass" });
   }
}

クラス ライブラリがイベントを起動する必要がある場合は、誰かがリッスンしていることを確認し、データをリスナーに渡すための適切な EventArgs を構築する OnDataReceived を呼び出す必要があります。

アプリケーションでは、メソッド シグネチャを変更する必要があります。

Library.Class a = new Library.Class();
a.DataReceived += ReceivedData;
a.start(ip, port);

//...

void ReceivedData(object sender, YourEventArgs e)
{
  string data = e.Data;
  //...
}
于 2013-05-11T06:24:02.960 に答える
2

デリゲートを渡すには、start メソッドのシグネチャを変更する必要があります。

public void start(string IP, int port, Action<string> callback)
{
    // start logic...

    // receives data from socket... send this data to user
    callback(data);
}

Library. Class a = new Library. Class();
a.start(ip, port, receivedData);

// I need this method called by library automatically when it receives data...

void receivedData(string data)
{
    // data which received by library....
}
于 2013-05-11T06:20:13.077 に答える
0

クラスにイベントを追加する

public event DataReceivedEventHandler DataReceived;
public delegate void DataReceivedEventHandler(object sender, SocketDataReceivedEventArgs e);

Ex のような必要なパラメータを含むクラスを作成します: SocketDataReceivedEventArgshere

のようなトリガーイベント

SocketDataReceivedEventArgs DataReceiveDetails = new SocketDataReceivedEventArgs();
DataReceiveDetails.data = "your data here";
DataReceived(this, DataReceiveDetails);

アプリケーション作成メソッドで

void receivedData(object sender, SocketDataReceivedEventArgs e)
{
    // e.data is data which received by library....
}

ハンドラーをそれにアタッチします

 Library. Class a = new Library. Class();
    a.DataReceived += receivedData;
    a.start(ip, port);

要件として、複数のスレッドで記述する必要があります 上記にスレッドセーフサポートを追加する方法は次のとおりです

Dispatcher.Invoke と別のスレッドからのテキスト ボックスへのアクセス

于 2013-05-11T06:28:18.970 に答える