c#题例-2025-07-20 08:25:09
日期: 2025-07-20 分类: AI写作 13次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、闭包、异步编程、线程安全、反射**等多个高级知识点,适合考察候选人的综合能力。
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)系统
#### 背景说明:
你需要实现一个简单的**线程安全的事件总线系统**,允许注册和触发事件处理程序,支持泛型事件类型,并支持同步和异步事件处理器。
---
### ✅ 功能需求:
1. **支持多个事件类型**,每个事件类型都有一个或多个订阅者(Handler)。
2. **支持同步和异步的事件处理程序**(即 `Action
3. **线程安全**:多个线程可以同时注册、注销、发布事件。
4. **支持自动注销**:如果某个订阅者是弱引用或实现了某种自动注销机制,能够在对象被回收后不造成内存泄漏。
5. **可扩展性**:允许通过反射动态注册事件处理器(例如通过特性 `[EventHandler]` 标记方法)。
---
### 📌 接口定义:
```csharp
public interface IEventBus
{
void Subscribe
void Subscribe
void Unsubscribe
void Unsubscribe
void Publish
Task PublishAsync
void AutoRegister(object subscriber);
}
```
---
### 💡 示例用法:
```csharp
public class MyEvent
{
public string Message { get; set; }
}
public class MyHandler
{
public void HandleEvent(MyEvent e)
{
Console.WriteLine("Sync handler: " + e.Message);
}
public async Task HandleEventAsync(MyEvent e)
{
await Task.Delay(100);
Console.WriteLine("Async handler: " + e.Message);
}
[EventHandler]
public void AnotherHandler(MyEvent e)
{
Console.WriteLine("Auto registered handler: " + e.Message);
}
}
```
```csharp
var eventBus = new EventBus();
var handler = new MyHandler();
eventBus.Subscribe(handler.HandleEvent);
eventBus.Subscribe(handler.HandleEventAsync);
eventBus.AutoRegister(handler);
eventBus.Publish(new MyEvent { Message = "Hello" });
eventBus.Unsubscribe(handler.HandleEvent);
eventBus.Unsubscribe(handler.HandleEventAsync);
```
---
### 🧩 高级考察点:
- 如何使用 `ConcurrentDictionary` 和 `ReaderWriterLockSlim` 实现线程安全?
- 如何统一处理同步和异步处理器?
- 如何实现自动注册(反射 + 特性)?
- 如何防止内存泄漏?(可选:引入 `WeakReference` 或 `WeakReference
- 如何在 `Publish` 中统一调用不同类型的处理器?
- 如何设计事件处理器的存储结构?(例如使用 `Dictionary
---
### 🧪 延伸问题(面试官可追问):
1. 如果事件处理中抛出异常,如何处理?
2. 如何支持事件处理器的优先级?
3. 如何支持事件的取消(CancelEventArgs)?
4. 如何在 ASP.NET Core 中集成这个 EventBus?
5. 如何测试线程安全?
---
如果你需要我提供一个参考实现,请告诉我!我可以给出一个完整可运行的示例。这个题目可以很好地考察一个 C# 高级开发者的**架构能力、语言掌握深度和多线程理解**。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐