Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-05 14:51:48

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、异步编程、闭包捕获、线程安全** 和 **设计模式思想**,综合考察候选人的语言功底与系统设计能力:

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)订阅发布系统

#### 背景:
你需要为一个大型分布式系统构建一个轻量级的本地事件总线(Event Bus),用于组件之间的解耦通信。该事件总线需要支持多线程环境下的事件订阅和发布。

#### 要求:

1. 实现一个泛型事件总线 `IEventBus`,其中 T 是事件的数据类型。
2. 支持多个订阅者注册到相同的事件类型,并在事件发布时被调用。
3. 所有事件处理应以**异步方式**执行(使用 `Func`)。
4. 必须是**线程安全的**,即允许多个线程并发订阅、取消订阅和发布事件。
5. 支持取消订阅功能。
6. 不允许内存泄漏(例如避免因未正确取消订阅导致的闭包引用问题)。

#### 接口定义如下:

```csharp
public interface IEventBus
{
IDisposable Subscribe(Func handler);
void Publish(T @event);
}
```

#### 问题内容:

- 请写出 `IEventBus` 的完整线程安全实现。
- 解释你如何管理订阅者的生命周期,防止内存泄漏。
- 如果某个订阅者在处理事件时抛出异常,你该如何处理?是否会影响其他订阅者?

---

### ✅ 参考答案要点(供面试官参考)

#### 1. 使用线程安全的集合结构:

建议使用 `ConcurrentDictionary` 或 `List<>` 加锁来保存订阅者。

#### 2. 封装订阅逻辑并返回 IDisposable:

通过封装一个 Token 或 Wrapper 对象,使订阅者可以通过 `IDisposable` 安全地取消订阅。

#### 3. 异步处理每个订阅者:

对每个订阅者调用 `handler(@event)` 时要 `await` 或 `Fire and forget`(注意异常处理)。

#### 4. 防止闭包捕获造成的内存泄漏:

使用弱引用或显式取消机制确保长期运行的对象不会阻止 GC。

#### 5. 异常隔离:

每个订阅者的执行应该独立,一个失败不影响其他订阅者。

---

### 💡 拓展追问(进阶):

- 如何扩展支持非泛型事件?
- 如何支持优先级排序?
- 如何支持同步 + 异步混合的订阅者?
- 如何测试线程安全性?
- 如果想引入缓存最近一次事件的功能(类似 Rx 的 `ReplaySubject`),如何实现?

---

这道题不仅考察了 C# 的高级特性,还要求候选人具备良好的系统抽象能力和并发编程经验,非常适合用于评估资深或专家级 C# 开发人员。是否需要我给出一份完整的参考实现代码?

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-07-05 20:25:12

下一篇: c#题例-2025-07-05 09:18:26

精华推荐