Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-16 17:25:14

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,涉及 **委托、泛型、异步编程、闭包、线程安全**等多个高级概念,适合考察资深 C# 开发者的综合理解能力。

---

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

#### 题目描述:

请设计并实现一个 **线程安全的异步事件总线(Event Bus)**,满足以下要求:

1. 支持注册和注销事件处理器(`EventHandler`)。
2. 支持异步发布事件(`PublishAsync`),事件发布时会调用所有订阅了该事件类型的处理器。
3. 所有事件处理器应**并行执行**,互不阻塞。
4. 处理器执行过程中抛出的异常应被捕获并汇总,不能中断其他处理器的执行。
5. 支持强类型事件(即每个事件类型 `TEvent` 是一个具体的类)。

#### 接口定义如下:

```csharp
public interface IEventBus
{
void Subscribe(EventHandler handler) where TEvent : class;
void Unsubscribe(EventHandler handler) where TEvent : class;
Task PublishAsync(TEvent @event, CancellationToken ct = default) where TEvent : class;
}
```

#### 附加问题(可选):

- 如何确保事件处理器注册/注销与发布的线程安全?
- 如何避免内存泄漏(比如事件源持有不再需要的长生命周期的委托)?
- 如何支持事件处理器的优先级执行顺序?

---

### ✅ 考察点:

| 技术点 | 考察内容 |
|--------|----------|
| 委托与事件 | 使用 `EventHandler` 的正确方式 |
| 泛型 | 实现类型安全的事件处理 |
| 异步编程 | `Task`, `await`, 并行执行 |
| 线程安全 | 使用 `ConcurrentDictionary` 或锁机制保护订阅列表 |
| 异常处理 | 捕获多个异常并继续执行其他处理器 |
| 高级语言特性 | 闭包、委托复制、内存泄漏预防(如弱引用) |

---

### 💡 示例答案(部分实现):

```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary> _subscribers = new();

public void Subscribe(EventHandler handler) where TEvent : class
{
_subscribers
.GetOrAdd(typeof(TEvent), _ => new List())
.Add(handler);
}

public void Unsubscribe(EventHandler handler) where TEvent : class
{
if (_subscribers.TryGetValue(typeof(TEvent), out var list))
{
list.Remove(handler);
}
}

public async Task PublishAsync(TEvent @event, CancellationToken ct = default) where TEvent : class
{
if (!_subscribers.TryGetValue(typeof(TEvent), out var handlers))
return;

var tasks = handlers
.Cast>()
.Select(async handler =>
{
try
{
await Task.Run(() => handler(this, @event), ct);
}
catch (Exception ex)
{
// 可记录或抛出异常聚合
Console.WriteLine($"Error in handler: {ex.Message}");
}
});

await Task.WhenAll(tasks);
}
}
```

---

### 📌 进阶建议:

- 使用 `IAsyncDisposable` 清理资源。
- 支持依赖注入(如与 `IServiceProvider` 集成)。
- 支持事件处理器的优先级(比如使用 `[Order]` 特性)。
- 使用 `WeakReference` 避免内存泄漏(适合专家级)。

---

如果你需要我提供完整的实现或对某个部分进行深入讲解,也可以告诉我!

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

上一篇: c#题例-2025-07-16 22:58:27

下一篇: c#题例-2025-07-16 11:51:53

精华推荐