致敬各位编码员,
我正在 .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
。任何帮助将不胜感激!
我建议您先阅读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
参数双向传递。