c#题例-2025-07-23 17:51:56
日期: 2025-07-23 分类: AI写作 20次阅读
当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 **委托、泛型、异步编程、闭包、线程安全与设计模式**等多个高级概念,考察候选人对 C# 语言和 .NET 框架的综合理解能力。
---
### 🧠 面试题:实现一个线程安全的事件发布/订阅系统(Event Aggregator)
#### 📌 背景描述:
你正在开发一个模块化的 WPF 或 ASP.NET Core 应用程序,需要一个**线程安全、泛型、支持异步处理**的事件发布/订阅系统(类似 Prism 或 MVVM Light 中的 `EventAggregator`)。
---
### 📄 题目要求:
请使用 C# 实现一个名为 `IEventAggregator` 的接口,包含以下方法:
```csharp
public interface IEventAggregator
{
void Subscribe
void Unsubscribe
Task PublishAsync
}
```
#### 要求:
1. 实现接口 `IEventAggregator` 的具体类 `EventAggregator`。
2. 支持多个事件类型(泛型)。
3. 支持多个订阅者(Action
4. 发布事件时,所有订阅者都应被调用,**即使其中一个订阅者抛出异常也不能中断其他订阅者的执行**。
5. 必须是线程安全的(支持并发订阅、取消订阅、发布操作)。
6. 支持异步发布(即 `PublishAsync` 是异步的)。
7. 不允许使用第三方库(如 Prism、MediatR 等)。
---
### 🧩 可选加分项:
- 使用 `WeakReference` 避免内存泄漏(适用于 UI 场景)。
- 支持通过 `IHandle
- 支持优先级排序(先订阅的先执行?或自定义顺序?)。
- 支持同步与异步混合的订阅者(比如 `Func
---
### 🧪 示例使用代码:
```csharp
var eventAggregator = new EventAggregator();
eventAggregator.Subscribe
{
Console.WriteLine($"Handler 1: {e.UserName}");
});
eventAggregator.Subscribe
{
throw new Exception("Oops!");
});
await eventAggregator.PublishAsync(new UserLoggedInEvent { UserName = "Alice" });
```
---
### ✅ 期望考察点:
- 对 `Action
- 对 `ConcurrentDictionary`、`ReaderWriterLockSlim` 或 `lock` 的使用。
- 对 `async/await` 在事件处理中的应用。
- 对异常处理的健壮性(try-catch 处理每个 handler)。
- 对线程安全集合与并发控制的理解。
- 对泛型约束和类型安全的把握。
- 对事件驱动架构的理解与设计能力。
---
如果你需要参考答案或想看一个完整实现,我可以继续为你提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐