C#事件总线FORM
时间: 2025-01-02 08:30:52 浏览: 8
### C# 中实现事件总线模式
在C#中,通过利用委托和事件机制能够有效地构建事件总线(Event Bus),这有助于解耦组件间的依赖关系并促进松散耦合的设计。对于Windows Forms应用程序而言,这种设计模式特别有用,因为它允许窗体之间以及不同业务逻辑层之间的消息传递更加灵活。
#### 定义全局事件总线类
为了创建一个简单的事件总线,在程序启动时初始化它,并让各个模块订阅感兴趣的事件:
```csharp
public class EventBus
{
public delegate void MessageReceivedHandler(string message);
public static event MessageReceivedHandler OnMessageReceived;
public static void Publish(string message)
{
OnMessageReceived?.Invoke(message); // 发布消息给所有监听者
}
}
```
此部分代码定义了一个静态`EventBus`类[^1],其中包含了用于处理字符串类型的消息接收器(`MessageReceivedHandler`)及其对应的事件(`OnMessageReceived`)。此外还提供了一个发布函数(Publish method),用来向所有的订阅者广播接收到的信息。
#### 订阅与取消订阅事件
任何想要响应特定事件的对象都可以注册成为该事件的监听者;同样地,也可以随时注销不再关心这些通知的行为。下面展示的是在一个典型的WinForms表单(Form)里如何完成上述操作的例子:
```csharp
private void SubscribeToEvents()
{
EventBus.OnMessageReceived += HandleNewMessages; // 注册回调方法作为事件处理器
}
private void UnsubscribeFromEvents()
{
EventBus.OnMessageReceived -= HandleNewMessages; // 移除之前设置好的事件处理器
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
UnsubscribeFromEvents(); // 当窗口关闭前确保已移除了所有关联的事件处理器
}
```
这里展示了两个辅助性的私有成员函数——`SubscribeToEvents()` 和 `UnsubscribeFromEvents()` ——它们分别负责添加或删除当前实例对公共事件总线上指定事件的兴趣点。另外值得注意的一点是在重写的`OnFormClosing` 方法内部调用了后者以防止内存泄漏等问题的发生。
#### 处理传入的数据
每当新的数据到达时就会触发相应的动作,比如更新UI控件的状态或是执行某些后台任务等。以下是具体做法的一个简单示例:
```csharp
private void HandleNewMessages(string message)
{
this.Invoke((MethodInvoker)(() =>
{
textBoxLog.AppendText($"{DateTime.Now}: {message}\r\n");
}));
}
```
这段代码片段说明了怎样安全地从非UI线程访问图形界面元素(即跨线程调用)。由于事件可能由任意位置发出,因此需要使用`Control.InvokeRequired`属性来判断是否有必要同步上下文环境再继续下一步骤的操作。
---
阅读全文