Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-08 05:18:26

当然可以!以下是一道**专家级别**的 C# 逻辑面试题,涵盖了 **委托、事件、闭包、线程安全、异步编程、以及设计模式** 的综合应用,适合用于考察高级 C# 开发人员的综合能力。

---

### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)并支持异步订阅

#### 📌 背景:
在现代的 C# 应用程序中,事件总线(Event Bus)常用于解耦模块之间的通信。你需要实现一个轻量级但功能完整的线程安全的事件总线系统。

---

### 📝 要求:

1. 实现一个名为 `IEventBus` 的接口,包含以下方法:
- `void Subscribe(Action handler)`:订阅一个同步事件。
- `void SubscribeAsync(Func handler)`:订阅一个异步事件。
- `void Publish(T @event)`:发布一个事件,通知所有订阅者。

2. 所有订阅和发布操作必须是**线程安全**的(支持并发订阅和发布)。
3. 每个事件类型 `T` 独立管理订阅者。
4. 实现一个简单的发布-订阅机制,不使用任何第三方库(如 Prism、MediatR 等)。
5. 请提供一个使用示例,包括同步和异步订阅者。

---

### 🎯 高级要求(加分项):

- 支持取消订阅(Unsubscribe)功能。
- 使用弱引用(WeakReference)避免内存泄漏(进阶)。
- 支持事件处理器的优先级排序。
- 支持一次订阅(Once)功能。

---

### ✅ 示例代码结构:

```csharp
public interface IEventBus
{
void Subscribe(Action handler);
void SubscribeAsync(Func handler);
void Publish(T @event);
}

public class EventBus : IEventBus
{
// 实现细节
}
```

---

### 💡 提示:

- 使用 `ConcurrentDictionary` 来管理不同类型事件的订阅者列表。
- 对于异步方法,注意使用 `await Task.Run(...)` 来并行执行多个异步处理器。
- 可以考虑使用 `Delegate.Combine` 来合并多个委托。
- 线程安全是关键,确保并发场景下不会出现竞争条件。

---

### 🧪 示例用法:

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

eventBus.Subscribe(e => Console.WriteLine($"Sync handler: {e.Message}"));
eventBus.SubscribeAsync(async e =>
{
await Task.Delay(100);
Console.WriteLine($"Async handler: {e.Message}");
});

eventBus.Publish(new SampleEvent { Message = "Hello World" });
```

---

如果你需要,我可以提供参考实现代码。这道题非常贴近实际开发中的架构设计,适合考察候选人的综合编码能力与对 C# 高级特性的掌握。是否需要我继续提供参考答案?

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

上一篇:无

下一篇: c#题例-2025-08-07 22:31:54

精华推荐