Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-23 05:31:53

当然可以!以下是一道**专家级别**的 **C# 逻辑面试题**,它结合了 **委托、泛型、异步编程、闭包、线程安全与设计模式** 等多个高级概念,适合考察资深 C# 开发者的综合理解与架构思维。

---

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

#### **题目描述:**

请使用 C# 实现一个线程安全、支持异步订阅与发布的通用事件总线 `IEventBus` 接口。接口定义如下:

```csharp
public interface IEventBus
{
IDisposable Subscribe(Func handler);
Task PublishAsync(T @event, CancellationToken ct = default);
}
```

#### **功能要求:**

1. 支持多个订阅者订阅同一事件类型。
2. 订阅者可以随时取消订阅(通过返回的 `IDisposable`)。
3. 发布事件时,所有订阅者都会异步收到通知,并执行其处理逻辑。
4. 保证线程安全:多个线程同时发布或订阅事件时不会出现竞态条件。
5. 处理逻辑应支持取消操作(通过 CancellationToken)。
6. 事件总线应避免内存泄漏(如处理好订阅者的生命周期)。

#### **附加要求(加分项):**

- 使用弱引用(WeakReference)防止订阅者无法被垃圾回收。
- 支持事件处理的顺序或优先级(如通过特性标记)。
- 提供单元测试验证基本功能。

---

### ✅ 考察点:

| 考点 | 说明 |
|------|------|
| 委托和Func | 使用 `Func` 表达异步处理逻辑 |
| 异步编程 | 使用 `Task` 和 `await` 正确发布事件 |
| 线程安全 | 使用 `ConcurrentDictionary`, `lock`, `Interlocked` 等保证线程安全 |
| IDisposable | 实现取消订阅机制 |
| 弱引用 | 防止订阅者导致内存泄漏(高级) |
| 闭包与捕获 | 注意订阅逻辑中的变量捕获问题 |
| 设计模式 | 观察者模式、工厂模式(可选) |
| 单元测试 | 验证多线程下行为正确性(可选) |

---

### 💡 提示:

- 使用 `ConrearrentDictionary>>>` 存储事件类型与订阅者。
- 在 `Subscribe` 方法中返回一个 `IDisposable` 来从列表中移除订阅者。
- `PublishAsync` 中应并发执行所有订阅者的处理函数,并处理异常与取消操作。

---

### 示例代码结构(供参考):

```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary _handlers = new();

public IDisposable Subscribe(Func handler)
{
// 实现订阅逻辑
}

public async Task PublishAsync(T @event, CancellationToken ct = default)
{
// 获取并执行所有订阅者
}
}
```

---

### 🧪 可选测试场景:

- 多个订阅者订阅同一事件,验证是否都被调用。
- 某个订阅者抛出异常,不影响其他订阅者。
- 使用 CancellationToken 取消事件处理。
- 订阅者被 GC 回收后,不再接收事件。

---

如果你需要我提供一份参考实现代码,也可以告诉我!是否现在就需要?

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

上一篇: c#题例-2025-07-23 12:18:34

下一篇: c#题例-2025-07-22 23:58:38

精华推荐