c#题例-2025-07-27 03:18:28
日期: 2025-07-27 分类: AI写作 15次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及**委托、泛型、异步编程、闭包、线程安全**等多个高级概念,适合考察候选人的综合编程能力和对 C# 特性的深入理解:
---
### 🧠 面试题:实现一个线程安全的异步事件总线(Event Bus)
#### 背景:
你需要为一个大型系统实现一个**线程安全、支持异步处理**的事件总线(Event Bus),用于在模块之间解耦地发布和订阅事件。
---
### 📌 题目要求:
请使用 C# 实现一个 `IEventBus` 接口,包含以下功能:
```csharp
public interface IEventBus
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
### 🧩 功能说明:
- `Subscribe
- `Unsubscribe
- `PublishAsync
- 所有操作必须是**线程安全**的,支持并发调用。
- 每个事件类型 `T` 可以有多个订阅者。
- 要确保在发布事件时不会因某个订阅者抛出异常而中断其他订阅者的执行。
---
### 💡 提示与考察点:
1. **线程安全的数据结构**:使用 `ConcurrentDictionary` 或 `ReaderWriterLockSlim` 等机制来管理事件和订阅者。
2. **委托的比较与存储**:注意 `Func
3. **异步并行执行**:多个订阅者应并发执行(可使用 `Task.Run` 或 `Parallel.ForEach` 等)。
4. **异常处理**:每个订阅者的异常应被捕获并记录,不影响其他订阅者。
5. **资源释放**:是否支持取消订阅?是否支持自动清理无用的事件类型?
---
### ✅ 示例代码结构:
```csharp
public class EventBus : IEventBus
{
private readonly ConcurrentDictionary
public void Subscribe
{
_handlers
.GetOrAdd(typeof(T), _ => new List
.Add(handler);
}
public void Unsubscribe
{
if (_handlers.TryGetValue(typeof(T), out var list))
{
list.RemoveAll(d => d.Equals(handler));
}
}
public async Task PublishAsync
{
if (_handlers.TryGetValue(typeof(T), out var handlers))
{
var tasks = handlers
.Cast
.Select(h => Task.Run(async () =>
{
try
{
await h(@event);
}
catch (Exception ex)
{
Console.WriteLine($"Handler for {typeof(T)} failed: {ex}");
}
}));
await Task.WhenAll(tasks);
}
}
}
```
---
### 🧪 测试用例建议:
你可以让候选人写出如下测试逻辑:
```csharp
var bus = new EventBus();
bus.Subscribe
{
await Task.Delay(100);
Console.WriteLine($"Sent email to {u.Name}");
});
bus.Subscribe
{
Console.WriteLine($"Logged user {u.Name}");
throw new Exception("Logging failed");
});
await bus.PublishAsync(new UserCreated { Name = "Alice" });
```
预期输出:
- “Sent email to Alice” ✅
- “Logged user Alice” ✅
- 错误信息:Logging failed ✅
- 程序不崩溃 ✅
---
### 🎯 总结考察点:
| 技术点 | 是否考察 |
|--------|----------|
| 委托和泛型 | ✅ |
| 异步编程(async/await) | ✅ |
| 线程安全(并发控制) | ✅ |
| 闭包和委托比较 | ✅ |
| 异常处理与隔离 | ✅ |
| 设计模式理解(观察者/事件总线) | ✅ |
---
如果你希望我提供一个更复杂的版本,比如支持依赖注入、优先级、过滤器、取消订阅 token 等,请告诉我,我可以继续扩展。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐