Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-09 21:25:08

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,考察的内容包括 **委托、泛型、异步编程、闭包、线程安全** 以及 **设计模式的理解**,适合高级或专家级别的 C# 开发者。

---

### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)

#### 背景:
你正在设计一个模块化的应用程序,多个组件之间需要通过**事件机制**进行通信。你决定实现一个**轻量级的事件总线(Event Bus)**,支持发布/订阅模式,并支持异步处理。

---

### 📌 题目要求:

实现一个名为 `AsyncEventBus` 的类,满足以下功能:

1. **支持泛型事件类型**(即每个事件类型是泛型参数 `TEvent`)。
2. **支持注册和取消注册事件处理器**:
```csharp
void Subscribe(Func handler);
void Unsubscribe(Func handler);
```
3. **支持发布事件**:
```csharp
Task PublishAsync(TEvent @event, CancellationToken ct = default);
```
- 事件发布是异步的。
- 所有订阅了该事件类型的处理器都应被调用。
- 支持 CancellationToken,用于取消事件处理。
4. **线程安全**:
- 多线程并发注册、取消注册和发布事件时应保证线程安全。
5. **避免内存泄漏**:
- 使用弱引用(WeakReference)支持可选的“弱订阅”模式(加分项)。
6. **异常处理**:
- 每个事件处理器的异常不应影响其他处理器的执行。
- 所有异常应被捕获并以某种方式通知调用者(如通过日志或回调)。

---

### 🧪 示例使用方式:

```csharp
var eventBus = new AsyncEventBus();

eventBus.Subscribe(async s =>
{
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

上一篇: c#题例-2025-08-10 02:58:30

下一篇: c#题例-2025-08-09 15:51:56

精华推荐