Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-24 15:45:25

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、闭包、线程安全、异步编程和内存泄漏预防**等多个高级概念:

---

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

#### 背景:
在现代应用程序中,事件聚合器(Event Aggregator)是一个常见的模式,用于解耦组件之间的通信。你需要设计一个简单的 `IEventAggregator` 接口及其实现,使得多个对象可以在不同线程上发布和订阅事件。

#### 要求:

1. 实现如下接口:

```csharp
public interface IEventAggregator
{
void Subscribe(Action handler);
void Publish(T message);
}
```

2. 保证以下特性:

- ✅ **线程安全**:多个线程可以同时调用 `Subscribe()` 和 `Publish()`。
- ✅ **弱引用机制**:防止订阅者导致内存泄漏(即当订阅者被 GC 回收时,其处理程序应自动解除绑定)。
- ✅ **泛型支持**:支持多种消息类型(如 `MessageA`, `MessageB`),不同类型的消息之间互不影响。
- ✅ **异步处理可选**:提供一种方式可以让处理函数以异步方式执行(比如通过 `Task.Run()` 或调度器)。
- ✅ **取消订阅功能**(Bonus):提供一个 `Unsubscribe` 方法或返回一个可用于取消订阅的对象。

3. 写出使用示例代码来演示其基本使用和多线程行为。

---

### 💡 提示与考察点:

- 如何用 `WeakReference` 或 `ConditionalWeakTable` 来管理弱引用?
- 使用什么结构存储不同类型的事件处理器?例如 `ConcurrentDictionary>`。
- 如何确保线程安全地添加、移除和调用事件处理器?
- 异步执行如何控制?是否需要支持同步上下文?
- 如何测试内存泄漏问题?

---

### 示例输出(使用方式):

```csharp
class Program
{
static async Task Main()
{
var eventAggregator = new EventAggregator();

// 订阅者1
var token1 = eventAggregator.Subscribe(msg => Console.WriteLine($"Received A: {msg.Content}"));

// 订阅者2
var token2 = eventAggregator.Subscribe(msg => Console.WriteLine($"Received B: {msg.Content}"));

// 发布消息
await Task.Run(() =>
{
eventAggregator.Publish(new MessageA { Content = "Hello" });
eventAggregator.Publish(new MessageB { Content = "World" });
});

// 取消订阅其中一个
token1.Unsubscribe();

// 再次发布,只有B会被收到
eventAggregator.Publish(new MessageA { Content = "Goodbye" });
eventAggregator.Publish(new MessageB { Content = "Again" });
}
}

class MessageA { public string Content { get; set; } }
class MessageB { public string Content { get; set; } }
```

---

### ✅ 附加挑战(高级):

- 支持基于 `IHandle` 接口的订阅者(而不是直接传递 Action)。
- 支持事件优先级。
- 支持事件过滤器(filter)。
- 支持事件管道(中间件式处理)。

---

如果你需要这道题目的参考答案或完整实现代码,请告诉我,我可以继续为你写出完整解决方案。

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

上一篇:无

下一篇: c#题例-2025-06-24 10:12:00

精华推荐