Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-15 06:51:50

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全**等多个高级概念,适合考察候选人对 C# 语言及其底层机制的掌握程度。

---

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

#### 📌 题目描述:

请你实现一个 **线程安全、支持异步处理的事件总线(Event Bus)**,满足以下要求:

1. 支持注册和注销事件处理器(Handler),事件类型为泛型。
2. 每个事件类型可以有多个处理器。
3. 处理器可以是异步的(`Func`)。
4. 事件发布时应并发执行所有注册的处理器(使用 `Task.Run` 或者异步方式)。
5. 确保线程安全,防止并发修改异常(如 `CollectionModifiedException`)。
6. 实现一个简单的取消机制(例如,通过 `CancellationToken` 来关闭事件总线)。

#### 📌 示例接口设计:

```csharp
public interface IEventBus
{
void Subscribe(Func handler);
void Unsubscribe(Func handler);
Task PublishAsync(TEvent @event, CancellationToken ct = default);
void Shutdown(); // 可选:用于取消所有正在运行的处理器
}
```

---

### 🧪 示例使用场景:

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

eventBus.Subscribe(async s =>
{
await Task.Delay(100);
Console.WriteLine($"Received: {s}");
});

await eventBus.PublishAsync("Hello EventBus!");
```

---

### 📝 考察点:

| 技术点 | 考察内容 |
|--------|----------|
| 泛型 | 使用泛型 `TEvent` 来支持多种事件类型 |
| 委托与Func | 使用 `Func` 表示异步处理器 |
| 线程安全 | 使用 `ConcurrentDictionary` 和 `ReaderWriterLockSlim` 或其他机制保护事件处理器集合 |
| 异步编程 | 使用 `Task.Run`, `await`, 并处理 `CancellationToken` |
| 闭包与捕获变量 | 正确理解闭包在异步处理器中的行为 |
| 事件总线设计 | 对事件总线模式的理解和实现能力 |
| 资源管理 | 如何优雅地关闭事件总线,避免内存泄漏 |

---

### 💡 提示:

- 使用 `ConcurrentDictionary>>` 来存储不同事件类型的处理器。
- 注意泛型的协变与逆变问题。
- 使用 `CancellationToken.Register` 来监听取消请求。
- 发布事件时,确保并发执行多个异步处理器(可以使用 `Task.Run` + `ToList()` + `Task.WhenAll`)。

---

### ✅ 进阶加分项:

- 支持按订阅者分组管理(如根据 `object` 标识符)。
- 支持同步和异步混合处理器。
- 实现优先级或顺序执行机制。
- 使用 `WeakReference` 避免内存泄漏(高级)。

---

如果你需要参考答案或实现代码,我也可以提供一份完整实现。是否需要?

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

上一篇:无

下一篇: c#题例-2025-07-15 01:18:35

精华推荐