Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-23 17:51:56

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,它结合了 **委托、泛型、异步编程、闭包、线程安全与设计模式**等多个高级概念,考察候选人对 C# 语言和 .NET 框架的综合理解能力。

---

### 🧠 面试题:实现一个线程安全的事件发布/订阅系统(Event Aggregator)

#### 📌 背景描述:

你正在开发一个模块化的 WPF 或 ASP.NET Core 应用程序,需要一个**线程安全、泛型、支持异步处理**的事件发布/订阅系统(类似 Prism 或 MVVM Light 中的 `EventAggregator`)。

---

### 📄 题目要求:

请使用 C# 实现一个名为 `IEventAggregator` 的接口,包含以下方法:

```csharp
public interface IEventAggregator
{
void Subscribe(Action handler) where T : class;
void Unsubscribe(Action handler) where T : class;
Task PublishAsync(T @event) where T : class;
}
```

#### 要求:

1. 实现接口 `IEventAggregator` 的具体类 `EventAggregator`。
2. 支持多个事件类型(泛型)。
3. 支持多个订阅者(Action)订阅同一事件。
4. 发布事件时,所有订阅者都应被调用,**即使其中一个订阅者抛出异常也不能中断其他订阅者的执行**。
5. 必须是线程安全的(支持并发订阅、取消订阅、发布操作)。
6. 支持异步发布(即 `PublishAsync` 是异步的)。
7. 不允许使用第三方库(如 Prism、MediatR 等)。

---

### 🧩 可选加分项:

- 使用 `WeakReference` 避免内存泄漏(适用于 UI 场景)。
- 支持通过 `IHandle` 接口订阅(而不是直接 Action)。
- 支持优先级排序(先订阅的先执行?或自定义顺序?)。
- 支持同步与异步混合的订阅者(比如 `Func` 与 `Action` 共存)。

---

### 🧪 示例使用代码:

```csharp
var eventAggregator = new EventAggregator();

eventAggregator.Subscribe(e =>
{
Console.WriteLine($"Handler 1: {e.UserName}");
});

eventAggregator.Subscribe(e =>
{
throw new Exception("Oops!");
});

await eventAggregator.PublishAsync(new UserLoggedInEvent { UserName = "Alice" });
```

---

### ✅ 期望考察点:

- 对 `Action` 和委托生命周期的理解。
- 对 `ConcurrentDictionary`、`ReaderWriterLockSlim` 或 `lock` 的使用。
- 对 `async/await` 在事件处理中的应用。
- 对异常处理的健壮性(try-catch 处理每个 handler)。
- 对线程安全集合与并发控制的理解。
- 对泛型约束和类型安全的把握。
- 对事件驱动架构的理解与设计能力。

---

如果你需要参考答案或想看一个完整实现,我可以继续为你提供。是否需要?

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

上一篇: c#题例-2025-07-23 23:25:12

下一篇: c#题例-2025-07-23 12:18:34

精华推荐