Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-04 14:18:46

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

---

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

#### 背景描述:

你正在开发一个模块化系统,多个组件之间需要通过一个**事件总线(Event Bus)**进行通信。你需要设计并实现一个轻量级、线程安全、支持异步处理的事件总线。

---

### 📌 要求:

实现一个泛型类 `EventBus`,满足以下要求:

1. 支持订阅事件:订阅者可以注册一个处理函数 `Func` 来处理特定类型的事件。
2. 支持取消订阅。
3. 支持发布事件:当发布一个事件时,所有订阅者都会被调用,**每个订阅者独立执行,互不影响**。
4. **线程安全**:多个线程可以同时订阅、取消订阅和发布事件,不能出现竞态条件或死锁。
5. **异步执行**:所有订阅者的处理函数都应该以异步方式执行。
6. 可以支持多个订阅者订阅相同的事件类型。

---

### 💡 示例代码结构(你可以补充实现):

```csharp
public class EventBus
{
private readonly object _lock = new object();
private List> _handlers = new List>();

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($"Subscriber 1 received: {msg}");
});

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

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

// 输出示例(顺序可能不同):
// Subscriber 1 received: Hello EventBus!
// Subscriber 2 received: Hello EventBus!
```

---

### 📝 高级问题扩展(面试时可继续追问):

- 如何避免在发布事件时对订阅者列表进行修改导致的异常?
- 如果希望支持多个事件类型(如 `EventBus`, `EventBus`),如何优化设计?
- 如果订阅者抛出异常,应该如何处理?是否要中止其他订阅者?
- 如何提高并发性能?是否可以使用 `ConcurrentDictionary` 或 `ImmutableList`?
- 如何支持优先级或同步/异步混合处理?

---

### ✅ 考察点总结:

| 技术点 | 是否考察 |
|------------------|----------|
| 委托与泛型 | ✅ |
| 线程安全与锁机制 | ✅ |
| 异步编程(async/await) | ✅ |
| 闭包与引用类型比较 | ✅ |
| 设计模式(观察者) | ✅ |
| 面向对象设计能力 | ✅ |

---

如果你想要这道题的标准答案或参考实现,我可以继续为你提供。是否需要?

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

上一篇:无

下一篇: c#题例-2025-08-04 07:31:58

精华推荐