c#题例-2025-08-07 11:25:05
日期: 2025-08-07 分类: AI写作 11次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察候选人在 **泛型、委托、闭包、异步编程、线程安全** 等方面的综合掌握能力:
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 背景描述:
在大型系统中,事件总线(Event Bus)常用于模块之间的解耦通信。你需要实现一个简单的泛型事件总线,支持订阅、发布和取消订阅操作,并确保线程安全。
---
### ✅ 题目要求:
请使用 C# 实现一个名为 `EventBus` 的类,满足以下要求:
1. 支持泛型事件类型,即每个事件类型 `TEvent` 有自己独立的订阅者列表。
2. 提供以下方法:
- `Subscribe
订阅某个事件类型,返回一个用于取消订阅的 `IDisposable` 对象。
- `Publish
异步发布一个事件,所有订阅者都应该被调用。
3. 所有订阅者必须在**发布事件时同步执行**(即不要使用 `Task.Run` 等启动新任务)。
4. 线程安全:多个线程可以同时调用 `Subscribe`、`Unsubscribe` 和 `Publish`。
5. 取消订阅必须高效,不能造成内存泄漏。
---
### 🔍 示例代码结构:
```csharp
public interface IEventBus
{
IDisposable Subscribe
void Publish
}
public class EventBus : IEventBus
{
// 实现细节
}
```
---
### 💡 提示:
- 使用 `ConcurrentDictionary
- 每个 `Subscribe` 返回的 `IDisposable` 应该能取消对应的订阅。
- 使用 `ReaderWriterLockSlim` 或 `lock` 来保证线程安全。
- 注意避免闭包捕获导致的内存泄漏。
- 可以考虑使用 `WeakReference` 实现弱引用订阅者(加分项)。
---
### 🧪 测试用例(可选):
```csharp
var bus = new EventBus();
int count = 0;
var subscription = bus.Subscribe
bus.Publish(5);
bus.Publish(10);
Console.WriteLine(count); // 应输出 15
subscription.Dispose();
bus.Publish(20);
Console.WriteLine(count); // 仍应输出 15
```
---
### 🧩 考察点总结:
| 技术点 | 是否考察 |
|----------------------|----------|
| 泛型编程 | ✅ |
| 委托与事件模型 | ✅ |
| 线程安全与并发控制 | ✅ |
| IDisposable 模式 | ✅ |
| 闭包与内存泄漏 | ✅ |
| 异步与同步上下文理解 | ✅ |
| 架构设计与解耦能力 | ✅ |
---
如果你需要我提供一个参考实现或解析,也可以告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐