c#题例-2025-07-15 06:51:50
日期: 2025-07-15 分类: AI写作 15次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全**等多个高级概念,适合考察候选人对 C# 语言及其底层机制的掌握程度。
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 📌 题目描述:
请你实现一个 **线程安全、支持异步处理的事件总线(Event Bus)**,满足以下要求:
1. 支持注册和注销事件处理器(Handler),事件类型为泛型。
2. 每个事件类型可以有多个处理器。
3. 处理器可以是异步的(`Func
4. 事件发布时应并发执行所有注册的处理器(使用 `Task.Run` 或者异步方式)。
5. 确保线程安全,防止并发修改异常(如 `CollectionModifiedException`)。
6. 实现一个简单的取消机制(例如,通过 `CancellationToken` 来关闭事件总线)。
#### 📌 示例接口设计:
```csharp
public interface IEventBus
{
void Subscribe
void Unsubscribe
Task PublishAsync
void Shutdown(); // 可选:用于取消所有正在运行的处理器
}
```
---
### 🧪 示例使用场景:
```csharp
var eventBus = new EventBus();
eventBus.Subscribe
{
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
标签:AI写作
上一篇:无
精华推荐