c#题例-2025-07-27 14:25:16
日期: 2025-07-27 分类: AI写作 9次阅读
当然可以!下面是一道**专家级别**的 C# 逻辑面试题,它综合考察了 **委托、事件、闭包、线程安全、异步编程** 和 **设计模式** 的理解,适合高级或专家级别的 C# 开发者:
---
### 🧠 面试题:实现一个线程安全、可订阅的“定时信号发生器”
#### 📌 题目描述:
你需要实现一个名为 `SignalGenerator` 的类,该类每隔一定时间发出一个“信号”,其他组件可以通过事件订阅这些信号。每个订阅者可以指定一个过滤条件,只接收满足条件的信号。
要求如下:
1. `SignalGenerator` 应该在后台持续运行,每隔指定时间间隔(例如 100ms)发送一个递增的整数信号(从 1 开始)。
2. 允许外部通过事件 `Signal` 订阅这个信号:
```csharp
public event Func
```
3. 每个订阅者可以附加一个谓词(`Func
4. 所有订阅者必须在**异步上下文中**被调用。
5. 必须确保线程安全(多个线程可能同时订阅/取消订阅)。
6. 信号发送时,所有满足条件的订阅者都应该被并发调用,互不阻塞。
7. 实现一个 `SubscribeAsync(Func
#### 📌 示例代码结构:
```csharp
public class SignalGenerator : IDisposable
{
public SignalGenerator(int intervalMs = 100) { }
public void Start();
public void Stop();
public void SubscribeAsync(Func
public void Dispose() => Stop();
}
```
---
### 🧪 使用示例:
```csharp
var generator = new SignalGenerator(200);
generator.SubscribeAsync(
i => i % 2 == 0,
async i => await Console.Out.WriteLineAsync($"Even: {i}")
);
generator.SubscribeAsync(
i => i % 3 == 0,
async i => await Console.Out.WriteLineAsync($"Divisible by 3: {i}")
);
generator.Start();
// 运行一段时间后
await Task.Delay(2000);
generator.Dispose();
```
预期输出类似:
```
Even: 2
Even: 4
Divisible by 3: 3
Even: 6
Divisible by 3: 6
...
```
---
### 💡 考察点解析:
| 考点 | 说明 |
|------|------|
| 异步事件处理 | 使用 `Func
| 多播委托与线程安全 | 如何安全地操作事件订阅与触发 |
| 定时器选择 | 使用 `System.Threading.Timer` 或 `PeriodicTimer` 实现后台定时任务 |
| 闭包和过滤器 | 每个订阅者绑定自己的过滤逻辑 |
| 并发执行 | 每个 handler 应该独立运行,不互相阻塞 |
| IDisposable 模式 | 正确释放资源,停止定时器 |
| 可测试性 | 是否能支持单元测试,比如虚拟时钟等 |
---
如果你需要这道题的标准实现代码或测试用例,我也可以提供。是否需要?
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐