Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-09 03:31:45

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全和设计模式**等多个高级知识点:

---

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

#### 题目描述:

你需要实现一个线程安全的事件总线(`IEventBus`),支持多个事件类型,能够订阅、取消订阅和发布事件。要求如下:

```csharp
public interface IEventBus
{
void Subscribe(string eventName, Action handler) where T : class;
void Unsubscribe(string eventName, Action handler) where T : class;
void Publish(string eventName, T @event) where T : class;
}
```

你需要完成该接口的实现类 `EventBus`,满足以下要求:

---

### ✅ 要求:

1. **线程安全**:多个线程可以同时调用 `Subscribe`、`Unsubscribe` 和 `Publish`。
2. **支持多个事件类型和名称**:同一个事件类型可能有多个事件名称(比如 `"OrderCreated"` 和 `"OrderUpdated"` 都是 `OrderEvent` 类型)。
3. **避免委托闭包捕获导致的内存泄漏问题**。
4. **在发布事件时保证异常隔离**:一个订阅者的异常不能影响其他订阅者。
5. **支持异步处理(加分项)**:可以提供一个 `PublishAsync` 方法,使用 `Task` 异步执行订阅者逻辑。
6. **避免委托重复订阅(可选加分)**。

---

### 💡 提示:

- 使用 `ConcurrentDictionary>` 来存储事件名和对应的处理委托。
- 使用锁或 `ReaderWriterLockSlim` 来控制对订阅/取消订阅的并发访问。
- 在 `Publish` 时使用 `Try/Catch` 包裹每个订阅者的调用。
- 对于异步支持,可以考虑使用 `Task.Run` 或者引入 `IAsyncPolicy` 等策略模式。

---

### ✅ 示例代码使用方式:

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

eventBus.Subscribe("OrderCreated", e => Console.WriteLine($"Order created: {e.OrderId}"));
eventBus.Subscribe("OrderUpdated", e => Console.WriteLine($"Order updated: {e.OrderId}"));

eventBus.Publish("OrderCreated", new OrderEvent { OrderId = "123" });
eventBus.Publish("OrderUpdated", new OrderEvent { OrderId = "456" });
```

---

### 🧪 附加问题(深入讨论):

1. 如何测试该事件总线的线程安全性?
2. 如果订阅者执行时间较长,如何优化性能?
3. 如何实现事件的优先级或顺序执行?
4. 如何扩展支持事件过滤、事件管道(pipeline)等机制?

---

这道题考察了应聘者对 C# 高级语言特性、并发编程、设计模式以及系统设计能力的掌握程度,非常适合用于**高级或专家级 C# 工程师的面试**。

如果你需要参考答案或希望我提供实现代码,我也可以继续补充。是否需要?

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

上一篇:无

下一篇: c#题例-2025-08-08 21:58:29

精华推荐