Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-03 14:52:02

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,它综合考察了候选人对 **委托、事件、异步编程、闭包、线程安全** 以及 **设计模式** 的掌握程度。

---

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

#### 背景:
在现代 C# 应用程序中,尤其是在 MVVM、插件系统或解耦模块之间通信时,经常会使用事件总线(Event Bus)来实现发布-订阅模型。你需要设计并实现一个轻量级但线程安全的事件总线。

---

### 💼 面试问题描述:

请使用 C# 实现一个名为 `ThreadSafeEventBus` 的类,满足以下要求:

1. 支持泛型事件类型,例如 `EventA`, `EventB`。
2. 支持多个订阅者订阅同一事件类型。
3. 支持同步和异步事件处理器。
4. 发布事件时,所有订阅者都应被通知。
5. 必须保证线程安全(多线程环境下订阅、发布、取消订阅都应安全)。
6. 支持取消订阅(Unsubscribe)操作。
7. 可选加分:支持弱引用订阅者以防止内存泄漏。

---

### 📌 示例代码结构(接口和使用方式):

```csharp
public interface IEventHandler
{
void Handle(TEvent @event);
}

public interface IAsyncEventHandler
{
Task HandleAsync(TEvent @event);
}

public class ThreadSafeEventBus
{
// 你的实现
}
```

#### 使用示例:

```csharp
var eventBus = new ThreadSafeEventBus();

class MyEventHandler : IEventHandler
{
public void Handle(MyEvent @event)
{
Console.WriteLine("Received: " + @event.Message);
}
}

class MyAsyncEventHandler : IAsyncEventHandler
{
public async Task HandleAsync(MyEvent @event)
{
await Task.Delay(100);
Console.WriteLine("Async Received: " + @event.Message);
}
}

var handler = new MyEventHandler();
var asyncHandler = new MyAsyncEventHandler();

eventBus.Subscribe(handler);
eventBus.Subscribe(asyncHandler);

eventBus.Publish(new MyEvent { Message = "Hello World" });

eventBus.Unsubscribe(handler);
```

---

### 🧩 考察点:

| 考察点 | 描述 |
|--------|------|
| 委托与事件 | 如何管理多个事件处理器 |
| 泛型编程 | 支持不同事件类型 |
| 线程安全 | 多线程环境下订阅/发布安全 |
| 异步编程 | 支持异步事件处理 |
| 弱引用(加分项) | 避免内存泄漏 |
| 设计模式 | 观察者模式、工厂模式(可选) |
| 性能优化 | 是否使用高效的集合结构(如 `ConcurrentDictionary`) |

---

### ✅ 参考实现提示:

- 使用 `ConcurrentDictionary>` 存储每个事件类型对应的处理函数。
- 使用 `lock` 或 `ReaderWriterLockSlim` 控制对订阅列表的访问。
- 使用 `Task.Run` 或 `await` 分别处理同步和异步处理器。
- 对于取消订阅,需从列表中移除对应的委托。
- 弱引用可以使用 `WeakReference` 或 `ConditionalWeakTable`(高级用法)。

---

如果你需要参考答案或完整实现,我也可以提供一份示例代码。是否需要?

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

上一篇:无

下一篇: c#题例-2025-08-03 09:18:44

精华推荐