c#题例-2025-06-24 15:45:25
日期: 2025-06-24 分类: AI写作 6次阅读
当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、事件、闭包、线程安全、异步编程和内存泄漏预防**等多个高级概念:
---
### 🧠 面试题:实现一个线程安全的事件发布/订阅系统(Event Aggregator)并避免内存泄漏
#### 背景:
在现代应用程序中,事件聚合器(Event Aggregator)是一个常见的模式,用于解耦组件之间的通信。你需要设计一个简单的 `IEventAggregator` 接口及其实现,使得多个对象可以在不同线程上发布和订阅事件。
#### 要求:
1. 实现如下接口:
```csharp
public interface IEventAggregator
{
void Subscribe
void Publish
}
```
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
// 订阅者2
var token2 = eventAggregator.Subscribe
// 发布消息
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
- 支持事件优先级。
- 支持事件过滤器(filter)。
- 支持事件管道(中间件式处理)。
---
如果你需要这道题目的参考答案或完整实现代码,请告诉我,我可以继续为你写出完整解决方案。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
上一篇:无
精华推荐