c#题例-2025-08-05 19:18:24
日期: 2025-08-05 分类: AI写作 7次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、闭包、线程安全、异步编程模型** 等多个高级概念,适合考察资深 C# 开发人员的综合能力:
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 背景:
你正在设计一个模块化的 .NET 应用程序,模块之间通过事件进行通信。你需要实现一个轻量级、线程安全、支持异步订阅和发布机制的事件总线 `IEventBus`。
#### 要求:
实现如下接口:
```csharp
public interface IEventBus : IDisposable
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
#### 功能说明:
- `Subscribe
- `Unsubscribe
- `PublishAsync
- 实现必须是**线程安全**的(支持并发订阅、取消订阅和发布)。
- 不允许内存泄漏(注意处理闭包、弱引用问题)。
- 考虑异常处理(订阅者抛异常不应中断其他订阅者)。
#### 高级加分项:
- 使用 `ConcurrentDictionary` 或其他线程安全结构来管理事件和订阅者。
- 使用 `CancellationToken` 支持取消发布操作。
- 使用 `WeakReference` 避免内存泄漏。
- 支持事件聚合器(Event Aggregator)模式。
- 使用 `ValueTask` 优化性能。
- 使用 `AsyncLocal
---
### 示例使用:
```csharp
var eventBus = new EventBus();
eventBus.Subscribe
{
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
标签:AI写作
精华推荐