Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-05 19:18:24

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

---

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

#### 背景:
你正在设计一个模块化的 .NET 应用程序,模块之间通过事件进行通信。你需要实现一个轻量级、线程安全、支持异步订阅和发布机制的事件总线 `IEventBus`。

#### 要求:
实现如下接口:

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

#### 功能说明:

- `Subscribe`:注册一个异步事件处理器。
- `Unsubscribe`:取消注册一个异步事件处理器。
- `PublishAsync`:异步发布事件,通知所有订阅者。
- 实现必须是**线程安全**的(支持并发订阅、取消订阅和发布)。
- 不允许内存泄漏(注意处理闭包、弱引用问题)。
- 考虑异常处理(订阅者抛异常不应中断其他订阅者)。

#### 高级加分项:

- 使用 `ConcurrentDictionary` 或其他线程安全结构来管理事件和订阅者。
- 使用 `CancellationToken` 支持取消发布操作。
- 使用 `WeakReference` 避免内存泄漏。
- 支持事件聚合器(Event Aggregator)模式。
- 使用 `ValueTask` 优化性能。
- 使用 `AsyncLocal` 实现上下文传递(进阶)。

---

### 示例使用:

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

eventBus.Subscribe(async user =>
{
await Console.Out.WriteLineAsync($"Hello, {user.Name}");
});

await eventBus.PublishAsync(new UserCreated { Name = "Alice" });
```

---

### 参考实现思路(可作为引导面试者讨论):

- 使用 `ConcurrentDictionary>>` 来保存事件类型和对应处理函数。
- 使用 `ReaderWriterLockSlim` 或 `lock` 来确保读写安全。
- 在 `PublishAsync` 中使用 `Task.Run` 或并行 `foreach` 分发事件。
- 处理异常时,使用 `try-catch` 包裹每个 handler。
- 对于 `Unsubscribe`,注意引用比较(避免闭包导致无法取消订阅)。

---

如果你希望我提供一个参考实现或讲解解题思路,我也可以继续展开。是否需要?

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

上一篇: c#题例-2025-08-06 00:51:51

下一篇: c#题例-2025-08-05 12:32:07

精华推荐