c#题例-2025-08-08 16:25:12
日期: 2025-08-08 分类: AI写作 8次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,它考察了对 **委托、事件、异步编程、闭包、线程安全** 以及 **设计模式** 的深入理解,非常适合用于考察资深 C# 开发人员:
---
### 🧠 面试题:实现一个线程安全的事件总线(Event Bus)
#### 背景描述:
你正在开发一个多模块系统,模块之间需要通过一个全局的事件总线(Event Bus)进行通信。你需要设计并实现一个轻量级的事件总线,支持以下功能:
- 支持注册和取消注册事件处理函数(使用泛型事件类型)。
- 支持异步发布事件(即事件处理可以是异步的)。
- 确保事件处理函数在发布事件时不会因为被提前注销而导致 NullReference 异常。
- 支持弱引用注册,防止内存泄漏(可选加分项)。
- 线程安全:支持并发注册、注销和发布事件。
---
### 📌 任务:
请实现一个 `IEventBus` 接口,并提供一个默认实现 `EventBus`。
接口定义如下:
```csharp
public interface IEventBus
{
IDisposable Subscribe
Task PublishAsync
}
```
其中:
- `Subscribe` 方法用于注册一个异步处理函数。
- 返回的 `IDisposable` 可用于取消订阅。
- `PublishAsync` 方法将事件发布给所有订阅者,所有订阅者应并发执行。
---
### 🧪 示例用法:
```csharp
var eventBus = new EventBus();
using (eventBus.Subscribe
{
await Task.Delay(100); // 模拟异步工作
Console.WriteLine($"Received: {e.Message}");
}))
{
var myEvent = new MyEvent { Message = "Hello EventBus!" };
await eventBus.PublishAsync(myEvent);
}
```
---
### ✅ 考察点:
1. **泛型委托处理**:如何保存和调用 `Func
2. **线程安全**:使用 `ConcurrentDictionary` 或锁机制确保并发安全。
3. **异步聚合**:如何并发执行多个异步处理函数(使用 `Task.WhenAll`)。
4. **IDisposable 模式**:优雅地支持取消订阅。
5. **弱引用处理(加分)**:使用 `WeakReference` 避免内存泄漏(可选)。
6. **异常处理**:是否考虑订阅者异常不影响其他订阅者。
7. **设计模式**:观察者模式、工厂模式、RAII 模式等。
---
### 💡 提示:
- 使用 `ConcurrentDictionary
- 可以封装订阅逻辑,返回一个 `IDisposable` 来移除对应的处理函数。
- 在 `PublishAsync` 中,建议使用 `Task.Run` 包裹每个处理函数以避免阻塞主线程。
---
如果你需要,我可以提供参考实现和详细解释。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐