Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-18 09:31:48

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 **委托、泛型、闭包、异步编程模型、线程安全** 和 **设计模式** 的概念,适合考察候选人对 C# 高级特性的掌握程度以及系统设计能力。

---

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

#### 背景:

在大型系统中,模块之间的解耦非常重要。事件总线(Event Bus)是一种常用于解耦模块间通信的设计模式。你需要实现一个线程安全、支持异步处理的轻量级事件总线系统。

---

### ✅ 要求:

1. 实现一个泛型事件总线类 `EventBus`,其中 `T` 是事件的类型。
2. 支持注册和取消注册事件处理函数(使用 `Func` 类型)。
3. 事件处理函数在发布事件时被调用,并且是**异步执行**的。
4. 系统必须是**线程安全**的,允许多线程并发注册、注销和发布事件。
5. 保证在事件发布过程中,注册的处理函数不会被并发修改(避免 `Collection was modified` 异常)。
6. 优化性能,避免不必要的锁竞争。
7. 可选加分:支持事件处理的优先级或顺序控制。

---

### 🧩 示例代码结构:

```csharp
public class EventBus
{
public void Subscribe(Func handler)
{
// 实现
}

public void Unsubscribe(Func handler)
{
// 实现
}

public async Task PublishAsync(T @event)
{
// 实现
}
}
```

---

### 🧪 使用示例:

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

bus.Subscribe(async msg =>
{
await Task.Delay(100); // 模拟异步操作
Console.WriteLine($"Received: {msg}");
});

await bus.PublishAsync("Hello EventBus");
```

---

### 📌 考察点:

- **线程安全**:如何在并发环境下安全地修改和遍历订阅列表。
- **异步处理**:正确使用 `async/await` 并处理多个异步任务。
- **委托与泛型**:理解 `Func` 的使用和泛型设计。
- **性能优化**:避免使用 `lock` 的粗粒度同步,比如使用快照(snapshot)机制或并发集合。
- **设计能力**:是否考虑扩展性、异常处理、资源释放等。

---

### 💡 提示:

- 可以使用 `ConcurrentDictionary` 或 `ImmutableList` 配合 `Interlocked` 来实现高效的线程安全订阅列表。
- 在 `PublishAsync` 中可以对当前订阅者列表做一个快照(复制),避免在遍历时修改原列表。
- 可以加入异常处理机制,防止一个 handler 的异常影响其他 handler。

---

如果你需要参考实现或者想看一个高质量的答案,请告诉我,我可以为你展示一个完整的线程安全版本。

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

上一篇:无

下一篇: c#题例-2025-07-18 03:58:22

精华推荐