Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-05 01:25:25

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及到 **委托、泛型、异步编程、闭包、线程安全** 等多个高级知识点,适合考察候选人对 C# 高级特性的掌握程度和系统设计能力:

---

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

#### 📌 题目描述:

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

1. 任意类型都可以作为事件类型(使用泛型)。
2. 支持订阅者注册和注销事件处理函数(使用 `Func` 委托)。
3. 支持广播事件,所有订阅者都会以**异步方式**处理事件。
4. 确保在并发环境下注册/注销和广播事件是线程安全的。
5. 处理订阅者时要避免内存泄漏(提示:可使用 `WeakReference` 或设计可注销的 token)。
6. 可选:支持事件处理函数的优先级排序。

---

### 🧾 示例接口定义(你可以补充和调整):

```csharp
public interface IEventBus
{
IDisposable Subscribe(Func handler);
Task PublishAsync(TEvent @event);
}
```

---

### 💡 考察点:

1. **泛型与委托的高级使用**:泛型事件类型和异步处理函数。
2. **线程安全与并发控制**:使用 `ConcurrentDictionary`、`ReaderWriterLockSlim` 或 `lock` 实现安全访问。
3. **异步编程模型(async/await)**:正确使用异步广播。
4. **资源管理与内存泄漏防范**:如何避免强引用导致的对象无法回收。
5. **良好的设计与可扩展性**:如优先级、取消订阅等。
6. **异常处理**:是否考虑订阅者抛出异常的情况。
7. **IDisposable 的正确实现**:用于取消订阅。

---

### ✅ 示例代码(参考实现片段):

以下是一个简化的实现框架,供你参考:

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

public IDisposable Subscribe(Func handler)
{
var handlers = _handlers.GetOrAdd(typeof(TEvent), _ => new List>());

((List>)handlers).Add(handler);

return new Unsubscriber(() =>
((List>)handlers).Remove(handler));
}

public async Task PublishAsync(TEvent @event)
{
if (_handlers.TryGetValue(typeof(TEvent), out var handlerList))
{
var tasks = ((List>)handlerList)
.Select(h => h(@event))
.ToList();

await Task.WhenAll(tasks);
}
}

private class Unsubscriber : IDisposable
{
private readonly Action _unsubscribe;

public Unsubscriber(Action unsubscribe) => _unsubscribe = unsubscribe;

public void Dispose() => _unsubscribe();
}
}
```

---

### 🧪 可能的扩展问题(进阶追问):

- 如何让事件处理函数按优先级执行?
- 如何支持取消某个特定的订阅者?
- 如何支持同步和异步混合的处理函数?
- 如何防止事件处理函数抛出异常导致整个 Publish 失败?
- 如何使用 `WeakReference` 来避免内存泄漏?

---

如果你需要,我也可以提供一个完整可运行的版本,包括测试用例。这个题目不仅考察语法,还考察架构设计能力,非常适合作为中高级 C# 面试的压轴题。需要我继续扩展吗?

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

上一篇: c#题例-2025-08-05 06:58:38

下一篇: c#题例-2025-08-04 19:52:05

精华推荐