c#题例-2025-07-23 12:18:34
日期: 2025-07-23 分类: AI写作 22次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全** 和 **设计模式** 的综合运用,适合考察候选人对 C# 语言高级特性的掌握和实际工程经验。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)系统
#### 背景:
你需要实现一个轻量级的事件总线系统,用于在不同组件之间解耦通信。该系统需要支持:
1. **泛型事件订阅**:可以订阅任意类型的事件(例如 `EventA`, `EventB` 等)。
2. **异步事件处理**:事件处理函数返回 `Task`。
3. **线程安全**:支持并发订阅和发布。
4. **防止内存泄漏**:使用弱引用或自动取消订阅机制。
5. **支持事件处理器优先级**(可选加分项)。
---
### 🧩 编程任务:
请实现以下接口:
```csharp
public interface IEventBus
{
IDisposable Subscribe
Task PublishAsync
}
```
并提供一个 `IDisposable` 的返回值,用于取消订阅。
---
### 🔍 考察点:
1. **泛型委托的使用**:如何处理 `Func
2. **线程安全**:使用 `ConcurrentDictionary` 或 `lock` 保证并发安全。
3. **资源管理**:如何实现 `IDisposable` 来取消订阅。
4. **弱引用**(加分):防止订阅者无法被 GC 回收。
5. **异步编程模型**:使用 `Task.WhenAll` 并发执行多个异步处理器。
6. **设计模式**:观察者模式的高级应用。
---
### ✅ 示例使用方式:
```csharp
var eventBus = new EventBus();
using (eventBus.Subscribe
{
Console.WriteLine($"Received: {e.Message}");
await Task.Delay(100); // 模拟异步操作
}))
{
await eventBus.PublishAsync(new MyEvent { Message = "Hello World" });
}
public class MyEvent
{
public string Message { get; set; }
}
```
---
### 💡 提示:
- 使用 `ConcurrentDictionary
- 实现 `IDisposable` 返回的 token 可用于从列表中移除 handler。
- 发布事件时要确保异步处理所有订阅者。
- 可以使用 `Action
---
### ✅ 附加问题(进阶):
- 如何测试这个事件总线的线程安全性?
- 如果事件处理器抛出异常应如何处理?
- 如何支持事件优先级?
- 如何支持事件拦截或日志记录?
---
如果你需要我提供参考实现或逐行解析,也可以告诉我!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐