c#题例-2025-08-07 22:31:54
日期: 2025-08-07 分类: AI写作 4次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、闭包、线程安全、异步编程** 和 **设计模式** 的综合应用,考察候选人的语言深度和系统设计能力:
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)并支持异步订阅
#### 📌 背景:
在现代的 C# 应用程序中,事件总线(Event Bus)是一个非常常见的组件,用于解耦模块之间的通信。你需要实现一个简单的事件总线,支持以下功能:
---
### ✅ 要求功能:
1. **事件订阅**:
- 任意类型都可以订阅某个事件类型。
- 支持同步和异步处理事件。
- 一个订阅者可以注册多个事件处理器。
2. **事件发布**:
- 发布事件后,所有匹配的订阅者都应该被通知。
- 支持同步发布和异步发布。
3. **线程安全**:
- 支持多线程环境下的订阅与发布。
- 订阅与发布操作应避免竞争条件。
4. **自动取消订阅**(进阶):
- 当订阅者对象被垃圾回收时,应自动从事件总线中移除其注册的处理器(提示:使用 `WeakReference`)。
5. **支持事件继承**(进阶):
- 如果发布了一个子类事件,订阅了父类事件的处理器也应被触发。
---
### 📦 示例接口定义(可自定义):
```csharp
public interface IEventBus
{
void Subscribe
void SubscribeAsync
void Unsubscribe(object subscriber);
void Unsubscribe
void Publish
Task PublishAsync
}
```
---
### 🧪 示例使用场景:
```csharp
public class MyEvent
{
public string Message { get; set; }
}
public class MyEventHandler
{
public void Handle(MyEvent e)
{
Console.WriteLine($"Sync Handler: {e.Message}");
}
public async Task HandleAsync(MyEvent e)
{
await Task.Delay(100);
Console.WriteLine($"Async Handler: {e.Message}");
}
}
// 使用示例
var bus = new EventBus();
var handler = new MyEventHandler();
bus.Subscribe
bus.SubscribeAsync
bus.Publish(new MyEvent { Message = "Hello World" });
await bus.PublishAsync(new MyEvent { Message = "Hello Async World" });
```
---
### 🧩 考察点:
- 对 `Action
- 对 `WeakReference` 和垃圾回收机制的掌握。
- 线程安全设计(如使用 `ConcurrentDictionary`、锁机制等)。
- 异步编程模型(async/await)的正确使用。
- 对事件继承和泛型协变的支持(使用 `is assignable from`)。
- 对面向对象设计原则的理解(如开闭原则、单一职责)。
- 性能优化意识(如避免频繁的锁、缓存事件类型等)。
---
### 💡 提示(可选提供):
- 使用 `ConcurrentDictionary
- 每个 `HandlerWrapper` 可以封装订阅者对象(使用 `WeakReference`)和实际的处理逻辑。
- 在发布事件时,遍历所有匹配的事件类型(包括基类)。
- 异步处理器应并行执行,并使用 `Task.WhenAll` 等进行聚合。
---
如果你需要参考实现或想看标准答案,我可以提供一个完整的代码示例。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐