C# 事件 发布订阅 解耦 event Action 委托
ConsoleApp\GemEqpService.cs
using System;
using System.Collections.Generic;
public class SendService
{
// 定义一个事件,该事件将在消息发送时触发。
// 事件使用Action委托,它接受一个元组作为参数,包含消息类型和消息内容。
public event Action<(int MessageType, string Message)>? OnTerminalMessageReceived;
public void SendMsg(int messageType, string message)
{
// 打印发送的消息到控制台
System.Console.WriteLine("-->" + $"[{messageType}] {message}");
// 触发事件,传递消息类型和消息内容
// 注意这里使用了空合运算符(?.)来避免在没有订阅者时调用Invoke引发异常。
OnTerminalMessageReceived?.Invoke((messageType, message));
}
}
public class Subscriber
{
public void SubscribeEvents(SendService service)
{
// 使用lambda表达式订阅事件,当有消息被发送时执行此匿名函数
service.OnTerminalMessageReceived += (msg) =>
{
Console.WriteLine("<--" + $"[{msg.Item1}] {msg.Item2}");
};
}
}
ConsoleApp\Program.cs
public class Program
{
public static async Task Main(string[] args)
{
// 创建服务实例,该实例将用于发送消息
var sender = new SendService();
// 创建订阅者实例,该实例将订阅消息接收事件
var subscriber = new Subscriber();
// 订阅sender实例的事件,使得每当有消息被发送时,subscriber能够接收到通知
subscriber.SubscribeEvents(sender);
// 发送两条不同的消息,这将触发事件,导致subscriber接收到通知并打印相应的信息
sender.SendMsg(10, "Hello, World!");
sender.SendMsg(20, "This is a test message.");
}
}