c#题例-2025-08-03 09:18:44
日期: 2025-08-03 分类: AI写作 13次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它涵盖了 **委托、泛型、异步编程、闭包、线程安全** 等多个高级概念,考察候选人对 C# 高级特性的理解与综合运用能力:
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 背景:
你需要为一个大型系统设计一个**线程安全、支持异步处理**的事件总线(Event Bus)系统,允许发布事件和订阅者以异步方式处理这些事件。
---
### 📌 要求:
1. **定义一个泛型事件处理器委托:**
```csharp
public delegate Task EventHandler
```
2. **实现一个接口:**
```csharp
public interface IEventBus
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
3. **实现细节要求:**
- 支持多个订阅者订阅同一个事件类型。
- 发布事件时,所有订阅者会**并发执行**其异步处理逻辑。
- 订阅和取消订阅操作必须是**线程安全**的。
- 多个线程同时调用 `PublishAsync` 时不能破坏内部状态。
- 避免内存泄漏(比如使用 `WeakReference` 或者合理管理生命周期)。
4. **附加挑战(可选):**
- 实现事件优先级(例如:先订阅的先执行,或通过特性标记优先级)。
- 提供取消令牌(`CancellationToken`)支持。
---
### ✅ 考察点:
- 对 C# 委托和事件机制的深入理解。
- 异步编程模型(`async/await` 和 `Task` 的正确使用)。
- 线程安全与并发控制(如使用 `ConcurrentDictionary`、`lock`、`ReaderWriterLockSlim` 等)。
- 泛型编程能力。
- 对闭包和引用管理的理解(避免内存泄漏)。
- 架构设计能力(接口设计、模块解耦等)。
---
### 🧪 示例用法:
```csharp
var eventBus = new EventBus();
eventBus.Subscribe
{
await Console.Out.WriteLineAsync($"Processing order: {order.Id}");
});
await eventBus.PublishAsync(new OrderCreated { Id = 123 });
```
---
### 💡 提示:
- 使用 `ConcurrentDictionary
- 使用 `Parallel.ForEach` 或 `Task.Run` 来并发执行订阅者的异步处理逻辑。
- 考虑使用 `Action
- 使用 `lock` 或 `SemaphoreSlim` 控制订阅/取消订阅的并发访问。
---
如果你需要参考实现或者面试官评估要点,我也可以继续为你提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐