gpt4 book ai didi

c# - 如何知道 dll 事件何时触发

转载 作者:行者123 更新时间:2023-12-01 18:50:53 26 4
gpt4 key购买 nike

我创建了一个包含此事件处理程序的 dll:

public void tcp1_Data(object sender, Sockets.DataEventArgs e)
{
Tcp tcp = (Tcp)sender;

response = "Socket Connection" + tcp.Tag.ToString() + " replied : " + e.Data.ToString();

tcp.Close();
}

当服务器在套接字连接中写入一些内容时,这将触发。这样,我就可以读取套接字上的数据了。

我在另一个项目中使用了这个dll。我想知道在我的项目(使用 dll)中服务器何时在套接字连接上写入数据。正如您在 tcp1_Data 事件中看到的,我将结果设置为响应变量,并且在主项目(使用 dll)中,我检查了此变量轮询(如果响应不为空,则意味着此事件已触发)。但这不是我想要的。我不想一直检查这个变量。

还有其他办法吗?

<小时/>

我尝试了这个,正如 @ThorstenDittmar 所说:

我的 dll 项目(其名称为 ClientSample)包含:

  1. TheClassInDLL 类

    public class TheClassInDLL
    {

    public event EventHandler<MyEventArgs> DataEventCalled;

    public void tcp1_Data(object sender, Sockets.DataEventArgs e)
    {
    Tcp tcp = (Tcp)sender;

    // Note: LOCAL variable
    string myresponse = "Socket Connection" + tcp.Tag.ToString() + " replied : " + e.Data.ToString();

    // Call the new event here
    if (DataEventCalled != null)
    DataEventCalled(this, new MyEventArgs(myresponse));

    tcp.Close();
    }

    // We use this class to pass arguments to the event handler
    public class MyEventArgs : EventArgs
    {
    public MyEventArgs(string response)
    {
    this.Response = response;
    }

    public string Response
    {
    get;
    private set;
    }
    }
    }
    1. TCPSample 类

    公共(public)类 TCPSample{ Tcp tcp = 新的 Tcp(); tcp.Data += 新的 System.EventHandler

    在另一个项目中我在上面使用了 dll:

    public partial class Form1 : Form
    {
    private TheClassInDLL myClass;
    ClientSample.TCPSample t = new ClientSample.TCPSample();

    public Form1()
    {
    InitializeComponent();

    myClass = new TheClassInDLL();
    myClass.DataEventCalled += DataEvent;
    }

    private void button1_Click(object sender, EventArgs e)
    {
    t.newTCP();
    }

    private void DataEvent(object sender, TheClassInDLL.MyEventArgs e)
    {
    MessageBox.Show(e.Response);
    }

    }

但是它不起作用,DataEvent 从未发生。感谢您的帮助...

最佳答案

您在这里编写的是一个事件处理程序,当发生某些事情时会调用该事件处理程序。必须有一个包含此事件处理程序的类。不要编写全局响应变量,而是声明并调用您可以从该类外部订阅的另一个事件,如下所示:

public class <TheClassInDLL>
{
public event EventHandler<MyEventArgs> DataEventCalled;

// SNIP: All the other code that leads to tcp1_Data being called
...

// The event handler that's called by some code in the class
public void tcp1_Data(object sender, Dart.Sockets.DataEventArgs e)
{
Tcp tcp = (Tcp)sender;

// Note: LOCAL variable
string myresponse = "Socket Connection" + tcp.Tag.ToString() + " replied : " + e.Data.ToString();

// Call the new event here
if (DataEventCalled != null)
DataEventCalled(this, new MyEventArgs(myresponse));

tcp.Close();
}

// We use this class to pass arguments to the event handler
public class MyEventArgs : EventArgs
{
public MyEventArgs(string response)
{
this.Response = response;
}

public string Response
{
get;
private set;
}
}
}

从调用者处,您可以这样使用它:

public class <TheCallingClassOutsideDLL>
{
private <TheClassInDLL> myClass;

public TheCallingClassOutsideDLL()
{
myClass = new TheClassInDLL();
myClass.DataEventCalled += DataEvent;
}

private void DataEvent(object sender, <TheClassInDLL>.MyEventArgs e)
{
Console.WriteLine(e.Response);
}
}

当然需要替换<TheClassInDLL><TheCallingClassOutsideDLL>与真实的类(class)名称!创建额外的类当然不起作用!

关于c# - 如何知道 dll 事件何时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24881276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com