Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-28 19:25:11

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

---

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

#### 📌 题目描述:

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

1. 支持注册多个事件处理函数(`Func`),每个事件类型 `TEvent` 可以有多个订阅者。
2. 支持发布事件,并**异步调用所有订阅者**处理该事件。
3. 确保事件处理函数之间是**解耦**的。
4. 实现线程安全,支持并发注册、注销和发布事件。
5. 支持取消注册事件处理函数(取消订阅)。

---

### 📝 示例接口定义:

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

---

### 🎯 考察点:

- 对 `Func<>`、`Action<>`、委托和闭包的掌握。
- 使用 `ConcurrentDictionary` 和 `CopyOnWrite` 技术保证线程安全。
- 对 `async/await` 异步模型的理解,尤其是并发执行多个异步任务。
- 对 `CancellationToken` 的使用。
- 对泛型和类型安全的理解。
- 对事件驱动架构和解耦设计的理解。

---

### ✅ 参考实现(可作为面试引导):

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

public void Subscribe(Func handler)
{
_handlers.AddOrUpdate(
typeof(TEvent),
_ => new List { handler },
(_, existing) =>
{
existing.Add(handler);
return existing;
});
}

public void Unsubscribe(Func handler)
{
if (_handlers.TryGetValue(typeof(TEvent), out var handlers))
{
handlers.Remove(handler);
}
}

public async Task PublishAsync(TEvent @event, CancellationToken ct = default)
{
if (_handlers.TryGetValue(typeof(TEvent), out var handlers))
{
var tasks = handlers
.OfType>()
.Select(h => h(@event))
.ToArray();

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

---

### 🧪 进阶问题(可选):

1. 如何优化 `Unsubscribe` 的效率?当前实现使用的是引用比较,是否可靠?
2. 如果事件处理函数抛出异常如何处理?是否需要捕获并记录?
3. 是否可以支持同步和异步混合的处理函数?
4. 如何支持事件继承(如发布一个 `ChildEvent` 同时触发 `ParentEvent` 的订阅者)?
5. 如何支持事件优先级?

---

这道题非常适合考察候选人对 C# 高级编程的理解和实际工程能力,同时也能引导出很多深入的技术讨论。

需要我继续扩展为完整可运行的单元测试示例吗?

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

上一篇: c#题例-2025-07-29 00:58:29

下一篇: c#题例-2025-07-28 13:51:42

精华推荐