Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-11 10:18:47

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **泛型、委托、闭包、异步编程模型(TPL) 和线程安全** 等高级概念,适合用于考察资深 C# 开发者的综合能力。

---

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

#### 背景:
你需要为一个大型分布式系统设计并实现一个简单的**线程安全事件总线(Thread-Safe Event Bus)**,支持事件的发布/订阅机制。该事件总线需要具备以下特性:

- 支持多个事件类型。
- 订阅者可以通过委托(`Func`)注册处理函数。
- 支持异步事件处理。
- 支持取消订阅。
- 必须是线程安全的(并发注册、取消订阅和发布事件时不能出错)。
- 不允许内存泄漏(如持有对象引用导致无法释放)。

---

### ✅ 要求:

1. 实现 `IEventBus` 接口如下:

```csharp
public interface IEventBus
{
void Subscribe(Func handler) where TEvent : class;
void Unsubscribe(Func handler) where TEvent : class;
Task PublishAsync(TEvent @event) where TEvent : class;
}
```

2. 实现类 `ThreadSafeEventBus` 满足上述所有要求。

---

### 💡 提示:

- 使用 `ConcurrentDictionary` 来保存每个事件类型的处理器集合。
- 注意委托的相等性比较问题(直接使用 `Func<,>` 可能会有闭包的问题)。
- 建议使用 `WeakReference` 或封装成弱引用包装器来避免内存泄漏。
- 所有订阅和发布操作必须是线程安全的。
- 发布事件时应并发执行各个处理器,并汇总异常(可使用 `Task.WhenAll` + 异常过滤)。

---

### 🎯 示例代码结构(仅供参考):

```csharp
public class ThreadSafeEventBus : IEventBus
{
private readonly ConcurrentDictionary> _handlers = new();

public void Subscribe(Func handler) where TEvent : class
{
// TODO: 实现线程安全的订阅逻辑
}

public void Unsubscribe(Func handler) where TEvent : class
{
// TODO: 实现取消订阅逻辑
}

public async Task PublishAsync(TEvent @event) where TEvent : class
{
// TODO: 安全获取所有有效处理器并异步调用
}
}

internal class WeakHandler
{
private readonly WeakReference> _weakDelegate;

public WeakHandler(Func handler)
{
// TODO: 封装成弱引用委托
}

public Func Target => // 获取目标委托或 null
}
```

---

### 📌 进阶问题(供进一步讨论):

1. 如何测试这个事件总线是否真的线程安全?
2. 如果某个事件处理器抛出异常,如何保证其他处理器继续执行?
3. 如果要支持同步和异步混合的处理器怎么办?
4. 如何优化性能,减少锁竞争?

---

这道题不仅考验语法掌握程度,还考察对 C# 高级特性和并发编程的理解,非常适合作为中高级开发岗位的最后一轮技术面题目。

如果你需要我提供完整参考答案,请告诉我 😊

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

上一篇:无

下一篇: c#题例-2025-07-11 03:31:48

精华推荐