c#题例-2025-07-16 17:25:14
日期: 2025-07-16 分类: AI写作 11次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全**等多个高级概念,适合考察资深 C# 开发者的综合理解能力。
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 题目描述:
请设计并实现一个 **线程安全的异步事件总线(Event Bus)**,满足以下要求:
1. 支持注册和注销事件处理器(`EventHandler
2. 支持异步发布事件(`PublishAsync`),事件发布时会调用所有订阅了该事件类型的处理器。
3. 所有事件处理器应**并行执行**,互不阻塞。
4. 处理器执行过程中抛出的异常应被捕获并汇总,不能中断其他处理器的执行。
5. 支持强类型事件(即每个事件类型 `TEvent` 是一个具体的类)。
#### 接口定义如下:
```csharp
public interface IEventBus
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
#### 附加问题(可选):
- 如何确保事件处理器注册/注销与发布的线程安全?
- 如何避免内存泄漏(比如事件源持有不再需要的长生命周期的委托)?
- 如何支持事件处理器的优先级执行顺序?
---
### ✅ 考察点:
| 技术点 | 考察内容 |
|--------|----------|
| 委托与事件 | 使用 `EventHandler
| 泛型 | 实现类型安全的事件处理 |
| 异步编程 | `Task`, `await`, 并行执行 |
| 线程安全 | 使用 `ConcurrentDictionary` 或锁机制保护订阅列表 |
| 异常处理 | 捕获多个异常并继续执行其他处理器 |
| 高级语言特性 | 闭包、委托复制、内存泄漏预防(如弱引用) |
---
### 💡 示例答案(部分实现):
```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary
public void Subscribe
{
_subscribers
.GetOrAdd(typeof(TEvent), _ => new List
.Add(handler);
}
public void Unsubscribe
{
if (_subscribers.TryGetValue(typeof(TEvent), out var list))
{
list.Remove(handler);
}
}
public async Task PublishAsync
{
if (!_subscribers.TryGetValue(typeof(TEvent), out var handlers))
return;
var tasks = handlers
.Cast
.Select(async handler =>
{
try
{
await Task.Run(() => handler(this, @event), ct);
}
catch (Exception ex)
{
// 可记录或抛出异常聚合
Console.WriteLine($"Error in handler: {ex.Message}");
}
});
await Task.WhenAll(tasks);
}
}
```
---
### 📌 进阶建议:
- 使用 `IAsyncDisposable` 清理资源。
- 支持依赖注入(如与 `IServiceProvider` 集成)。
- 支持事件处理器的优先级(比如使用 `[Order]` 特性)。
- 使用 `WeakReference` 避免内存泄漏(适合专家级)。
---
如果你需要我提供完整的实现或对某个部分进行深入讲解,也可以告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐