c#题例-2025-08-09 21:25:08
日期: 2025-08-09 分类: AI写作 10次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察的内容包括 **委托、泛型、异步编程、闭包、线程安全** 以及 **设计模式的理解**,适合高级或专家级别的 C# 开发者。
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 背景:
你正在设计一个模块化的应用程序,多个组件之间需要通过**事件机制**进行通信。你决定实现一个**轻量级的事件总线(Event Bus)**,支持发布/订阅模式,并支持异步处理。
---
### 📌 题目要求:
实现一个名为 `AsyncEventBus` 的类,满足以下功能:
1. **支持泛型事件类型**(即每个事件类型是泛型参数 `TEvent`)。
2. **支持注册和取消注册事件处理器**:
```csharp
void Subscribe
void Unsubscribe
```
3. **支持发布事件**:
```csharp
Task PublishAsync
```
- 事件发布是异步的。
- 所有订阅了该事件类型的处理器都应被调用。
- 支持 CancellationToken,用于取消事件处理。
4. **线程安全**:
- 多线程并发注册、取消注册和发布事件时应保证线程安全。
5. **避免内存泄漏**:
- 使用弱引用(WeakReference)支持可选的“弱订阅”模式(加分项)。
6. **异常处理**:
- 每个事件处理器的异常不应影响其他处理器的执行。
- 所有异常应被捕获并以某种方式通知调用者(如通过日志或回调)。
---
### 🧪 示例使用方式:
```csharp
var eventBus = new AsyncEventBus();
eventBus.Subscribe
{
await Task.Delay(100); // 模拟异步操作
Console.WriteLine($"Received: {s}");
});
await eventBus.PublishAsync("Hello EventBus!");
```
输出:
```
Received: Hello EventBus!
```
---
### 💡 提示与考察点:
- 使用 `ConcurrentDictionary
- 注意委托的协变与逆变问题(使用 `Func
- 使用 `SemaphoreSlim` 或锁来保证订阅/取消订阅和发布的线程安全。
- 异步任务的并行执行和异常处理(例如使用 `Task.WhenAll` 和 `try-catch` 包裹每个处理器)。
- 可选:使用 `WeakReference` 实现弱订阅,避免内存泄漏(适用于生命周期短的对象)。
- 可选:支持事件处理器优先级、取消传播等(进阶功能)。
---
### ✅ 附加问题(用于深入讨论):
1. 如何在不使用锁的情况下实现线程安全?
2. 如何测试这个事件总线的线程安全性?
3. 如果一个事件处理器长时间阻塞,如何避免影响其他处理器?
4. 如何扩展为支持同步和异步混合的处理器?
5. 如何支持事件继承(即订阅基类事件能接收到子类事件)?
---
如果你希望我提供参考实现代码,我也可以为你写出一个完整的示例实现。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐