关于 "C#基于自定义事件EventArgs实现发布订阅模式" 的完整攻略,可以从以下几个方面讲解:
一、理解发布订阅模式
简单来说,发布订阅模式(Publish/Subscribe Pattern,又称为观察者模式)是一种消息模型,其中一个消息的发布者 (Publisher) 不会直接向某个特定的订阅者 (Subscriber) 发送消息,而是发布(广播)事件给所有订阅者,订阅者可以自己选择性消费这些事件。它常被用于异步消息处理和事件驱动系统中。
二、应用自定义事件args
C#的事件封装的非常好,事件需要一个委托类型和一个事件名,类似于:
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler SomethingHappened;
其中 SomethingHappened
就是一个事件名,它关联了一个委托类型 EventHandler
,它要求传递两个参数:object sender
和 EventArgs e
,其中 EventArgs
是一个空类,表示事件接收者(订阅者)所关心的信息为空。
我们可以基于自定义的 EventArgs
类型来实现自定义事件模型。首先需要定义自定义 EventArgs
类型,如:
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
public int Code { get; set; }
}
然后,事件委托的定义注意,委托的第二个参数使用自定义的 CustomEventArgs
类:
public class Publisher
{
public delegate void SomethingHappenedEventHandler(object sender, CustomEventArgs e);
public event SomethingHappenedEventHandler SomethingHappened;
public void DoSomething(int code, string message)
{
Console.WriteLine("Start to do something.");
Thread.Sleep(2000); // 模拟处理过程
// 发布事件给订阅者
OnSomethingHappened(new CustomEventArgs { Code = code, Message = message });
}
protected virtual void OnSomethingHappened(CustomEventArgs e)
{
SomethingHappened?.Invoke(this, e);
}
}
三、实现发布订阅模式
发布订阅模式的实现步骤如下:
- 定义一个
Publisher
类,包含一个自定义事件,以及发起事件的方法。 - 定义一个
Subscriber
类,事件处理方法。 - 创建
Publisher
的实例对象,并将多个Subscriber
订阅上它的事件。 - 调用
Publisher
的发起事件方法,它会自动通知已订阅的Subscriber
对象。
示例一:
public class SubscriberA
{
public void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"SubscriberA received event (Code={e.Code}, Message={e.Message}).");
}
}
public class SubscriberB
{
public void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"SubscriberB received event (Code={e.Code}, Message={e.Message}).");
}
}
// 创建发布者对象
Publisher publisher = new Publisher();
// 创建订阅者对象
SubscriberA subA = new SubscriberA();
SubscriberB subB = new SubscriberB();
// 将订阅者对象订阅到发布者对象的事件上
publisher.SomethingHappened += subA.HandleEvent;
publisher.SomethingHappened += subB.HandleEvent;
// 做一些处理,发起事件
publisher.DoSomething(200, "This is a message.");
// 取消订阅
publisher.SomethingHappened -= subB.HandleEvent;
// 再次发起事件
publisher.DoSomething(201, "Another message.");
示例二:
public class SubscriberC
{
public void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"SubscriberC received event (Code={e.Code}, Message={e.Message}).");
// 事件处理过程中,如果需要调用其他外部接口做进一步处理,都可以在发布订阅模式的“订阅事件处理”中添加相关逻辑。
}
}
Publisher publisher = new Publisher();
SubscriberC subC = new SubscriberC();
publisher.SomethingHappened += subC.HandleEvent;
publisher.DoSomething(202, "This is another message.");
publisher.SomethingHappened -= subC.HandleEvent;
四、总结
在实际开发中,应用发布订阅模式可以帮助解耦,也可以帮助实现复杂的异步逻辑。自定义事件args的使用,可以方便我们处理一些需要传递的数据,更加灵活。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于自定义事件EventArgs实现发布订阅模式 - Python技术站