Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-01 05:59:27

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、异步编程和设计模式** 的综合运用,适合考察候选人的高级语言特性和系统设计能力。

---

### 🧠 面试题:实现一个可扩展的异步事件总线(Event Bus)

#### 背景:

你正在为一个模块化系统设计一个**轻量级异步事件总线(Event Bus)**。这个事件总线需要支持:

- 多种事件类型(使用泛型)
- 注册多个事件处理器(Handler)
- 异步处理事件
- 支持取消注册处理器
- 可扩展性(便于将来添加过滤、优先级等功能)

---

### ✅ 任务要求:

请你编写一个 `IEventBus` 接口及其实现类 `AsyncEventBus`,满足以下功能:

```csharp
public interface IEventBus
{
void Subscribe(Func handler) where TEvent : class;
void Unsubscribe(Func handler) where TEvent : class;
Task PublishAsync(TEvent @event) where TEvent : class;
}
```

#### 功能说明:

- `Subscribe`:注册一个异步处理器来监听指定类型的事件。
- `Unsubscribe`:取消注册该处理器。
- `PublishAsync`:发布一个事件,并异步调用所有已注册的处理器。

---

### 💡 进阶问题(供进一步讨论):

1. 如何确保在并发环境下订阅和发布的线程安全?
2. 如果某个 Handler 抛出异常,如何避免中断其他 Handler 的执行?
3. 如何扩展以支持同步与异步混合的 Handler?
4. 如何引入“一次性订阅”或“按优先级执行”的特性?
5. 是否可以结合依赖注入(DI)来管理 Handlers?

---

### 📌 示例代码调用方式:

```csharp
var eventBus = new AsyncEventBus();

eventBus.Subscribe(async e =>
{
await Task.Delay(100); // 模拟异步操作
Console.WriteLine($"Received log: {e.Message}");
});

await eventBus.PublishAsync(new LogEvent { Message = "Hello World" });
```

---

### 🧪 建议测试点:

- 订阅多个相同类型的 Handler,验证是否都能收到事件。
- 发布不同类型事件时,确保只触发对应类型的 Handler。
- 在多线程环境中并发订阅和发布,检查线程安全性。
- 测试取消订阅后是否不再响应事件。

---

如需参考答案或完整实现思路,我也可以提供。是否现在就需要?

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇:无

下一篇: c#题例-2025-07-01 00:26:06

精华推荐