如何在c#中从库到应用程序生成回调(事件)

Nev*_*uit 7 c# oop dll events

我正在开发一个库(DLL),我需要向用户提供事件(中断)作为一个带数据的方法.库的工作是在套接字上开始列出,从套接字接收数据并在一个方法中将此数据传递给用户.

图书馆:

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

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

}
Run Code Online (Sandbox Code Playgroud)

应用:

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....
}
Run Code Online (Sandbox Code Playgroud)

如何用库中的数据向应用程序引发事件?

提前致谢....

gra*_*noz 14

像这样在您的库中添加一个事件:

public event Action<string> OnDataReceived = null;
Run Code Online (Sandbox Code Playgroud)

然后,在应用程序中:

Library.Class a = new Library.Class();
a.OnDataReceived += receivedData;
a.start(ip, port);
Run Code Online (Sandbox Code Playgroud)

而已.

但是您可能希望使用约定编写事件,我建议您开始使用它,因为.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" });
   }
}
Run Code Online (Sandbox Code Playgroud)

当你的类库想要启动事件时,它应该调用OnDataReceived,它负责检查有人正在监听并构造适当的EventArgs以便将数据传递给监听器.

在应用程序中,您应该更改方法签名:

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

//...

void ReceivedData(object sender, YourEventArgs e)
{
  string data = e.Data;
  //...
}
Run Code Online (Sandbox Code Playgroud)