如何通过订阅的事件处理程序传回参数

问题描述 投票:0回答:1

致敬各位编码员,

我正在 .NET 标准 3.1 控制台程序中编写 tcpClient。客户端类正在连接到工业打印机的事件通道,这意味着从服务器发送的消息最多是零星的。

我目前有一个线程正在运行,它会自动检索与主程序执行并行的服务器消息。在检索过程中,会触发以下事件:

/*####################### myTcpClass #######################*/
public event EventHandler OnMessageReceived;
private void CallOnMessageReceived()
{
    var handler = this.OnMessageReceived;
    handler?.Invoke(null, EventArgs.Empty);
}

当触发此事件时,我想将消息back 发送到订阅的方法,允许在类之外使用该消息。我的想法是这样的:

/*###################### MAIN PROGRAM ######################*/
// creation of tcp client, auto-connects on creation
myTcpClass myTcp = new myTcpClass(ip:"123.123.123.123", port:22171);
// subscribe event
myTcp.OnMessageReceived += delegate (object sender, EventArgs e, String receivedMessage)
{
    // do something here with received message...
};

对于我的生活,我无法弄清楚如何向订阅的方法返回一个值,我的在线搜索到目前为止已经返回

null
。任何帮助将不胜感激!

c# event-handling delegates tcpclient
1个回答
1
投票

我建议您先阅读this,它解释了如何编写您自己的事件并双向传递数据。

当您将事件声明为

EventHandler
类型时,事件处理程序的第二个参数是类型
EventArgs
并且该类型没有以任何方式传递数据的属性。如果你想向事件处理程序传递数据和/或从事件处理程序传递数据,那么你需要声明你自己的继承
EventArgs
的类型并添加所需的属性。然后,您将事件声明为
EventHandler<TEventArgs>
类型,其中
TEventArgs
被指定为您的类型。

例如,你可以声明这个类:

public class SomeEventArgs : EventArgs
{
    // Data sent from the object raising the event to the object handling the event.
    public string Output { get; }

    // Data sent from the object handling the event to the object raising the event.
    public string Input { get; set; }

    public SomeEventArgs(string output)
    {
        this.Output = output;
    }
}

然后在这样的类中使用它:

public event EventHandler<SomeEventArgs> SomeEvent;

protected virtual void OnSomeEvent(SomeEventArgs e)
{
    SomeEvent?.Invoke(this, e);
}

private void DoSomething()
{
    var e = new SomeEventArgs("Hello");

    OnSomeEvent(e);

    Console.WriteLine(e.Input);
}

那个事件可能会这样处理:

private void SomeObject_SomeEvent(object sender, SomeEventArgs e)
{
    Console.WriteLine(e.Output);

    e.Input = "Goodbye";
}

所有数据都通过

e
参数双向传递。

© www.soinside.com 2019 - 2024. All rights reserved.