c#题例-2025-07-18 09:31:48
日期: 2025-07-18 分类: AI写作 9次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 **委托、泛型、闭包、异步编程模型、线程安全** 和 **设计模式** 的概念,适合考察候选人对 C# 高级特性的掌握程度以及系统设计能力。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)系统
#### 背景:
在大型系统中,模块之间的解耦非常重要。事件总线(Event Bus)是一种常用于解耦模块间通信的设计模式。你需要实现一个线程安全、支持异步处理的轻量级事件总线系统。
---
### ✅ 要求:
1. 实现一个泛型事件总线类 `EventBus
2. 支持注册和取消注册事件处理函数(使用 `Func
3. 事件处理函数在发布事件时被调用,并且是**异步执行**的。
4. 系统必须是**线程安全**的,允许多线程并发注册、注销和发布事件。
5. 保证在事件发布过程中,注册的处理函数不会被并发修改(避免 `Collection was modified` 异常)。
6. 优化性能,避免不必要的锁竞争。
7. 可选加分:支持事件处理的优先级或顺序控制。
---
### 🧩 示例代码结构:
```csharp
public class EventBus
{
public void Subscribe(Func
{
// 实现
}
public void Unsubscribe(Func
{
// 实现
}
public async Task PublishAsync(T @event)
{
// 实现
}
}
```
---
### 🧪 使用示例:
```csharp
var bus = new EventBus
bus.Subscribe(async msg =>
{
await Task.Delay(100); // 模拟异步操作
Console.WriteLine($"Received: {msg}");
});
await bus.PublishAsync("Hello EventBus");
```
---
### 📌 考察点:
- **线程安全**:如何在并发环境下安全地修改和遍历订阅列表。
- **异步处理**:正确使用 `async/await` 并处理多个异步任务。
- **委托与泛型**:理解 `Func
- **性能优化**:避免使用 `lock` 的粗粒度同步,比如使用快照(snapshot)机制或并发集合。
- **设计能力**:是否考虑扩展性、异常处理、资源释放等。
---
### 💡 提示:
- 可以使用 `ConcurrentDictionary` 或 `ImmutableList
- 在 `PublishAsync` 中可以对当前订阅者列表做一个快照(复制),避免在遍历时修改原列表。
- 可以加入异常处理机制,防止一个 handler 的异常影响其他 handler。
---
如果你需要参考实现或者想看一个高质量的答案,请告诉我,我可以为你展示一个完整的线程安全版本。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐