Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-29 19:25:43

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及到 **委托、泛型、闭包、线程安全、异步编程** 和 **设计模式** 的综合运用,适合考察候选人对 C# 高级特性和系统设计的理解。

---

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

#### 背景:
在大型系统中,经常需要使用事件驱动架构来解耦模块之间的通信。为此,你被要求实现一个简单的线程安全的“事件总线”系统。

---

### ✅ 题目要求:

请用 C# 实现一个泛型线程安全的 `IEventBus` 接口,满足以下功能:

```csharp
public interface IEventBus
{
IDisposable Subscribe(Action handler);
void Publish(T @event);
}
```

#### 功能说明:

- `Subscribe` 方法用于订阅某个类型的事件,返回一个 `IDisposable` 对象用于取消订阅。
- `Publish` 方法用于发布某个类型的事件,通知所有订阅者。
- 必须保证多线程环境下订阅和发布的线程安全性。
- 使用 `IDisposable` 返回对象用于取消订阅,避免内存泄漏。
- 不允许使用 `System.Windows.Forms` 或 `System.Communication` 等外部框架提供的事件总线。

---

### 💡 进阶要求(面试官可选追问):

1. 如何优化内存泄漏问题?比如处理弱引用订阅者?
2. 如何支持异步处理事件(即订阅者是 `Func`)?
3. 如何支持事件处理器优先级或过滤机制?
4. 如果多个事件类型有继承关系,是否应该触发父类事件?
5. 如何测试这个事件总线的线程安全性?

---

### 🧪 示例代码调用方式:

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

using (bus.Subscribe(s => Console.WriteLine("Received: " + s)))
{
bus.Publish("Hello World");
}
```

输出应为:

```
Received: Hello World
```

---

### 📌 提示:

- 使用 `ConcurrentDictionary>` 存储事件与订阅者的映射。
- 每次订阅时生成一个 token 或唯一标识符,用于取消订阅。
- 可以考虑使用 `ReaderWriterLockSlim` 或 `lock` 来保护字典访问。
- 在取消订阅时,确保操作是原子且线程安全的。
- 可封装一个内部类实现 `IDisposable`,用于清理订阅。

---

如果你想要我提供参考答案或者想看看不同实现方式(同步/异步、弱引用等),也可以告诉我 😊

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

上一篇: c#题例-2025-06-30 00:59:07

下一篇: c#题例-2025-06-29 13:52:27

精华推荐