Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-27 14:25:16

当然可以!下面是一道**专家级别**的 C# 逻辑面试题,它综合考察了 **委托、事件、闭包、线程安全、异步编程** 和 **设计模式** 的理解,适合高级或专家级别的 C# 开发者:

---

### 🧠 面试题:实现一个线程安全、可订阅的“定时信号发生器”

#### 📌 题目描述:

你需要实现一个名为 `SignalGenerator` 的类,该类每隔一定时间发出一个“信号”,其他组件可以通过事件订阅这些信号。每个订阅者可以指定一个过滤条件,只接收满足条件的信号。

要求如下:

1. `SignalGenerator` 应该在后台持续运行,每隔指定时间间隔(例如 100ms)发送一个递增的整数信号(从 1 开始)。
2. 允许外部通过事件 `Signal` 订阅这个信号:
```csharp
public event Func Signal;
```
3. 每个订阅者可以附加一个谓词(`Func`)来过滤只接收满足条件的信号。
4. 所有订阅者必须在**异步上下文中**被调用。
5. 必须确保线程安全(多个线程可能同时订阅/取消订阅)。
6. 信号发送时,所有满足条件的订阅者都应该被并发调用,互不阻塞。
7. 实现一个 `SubscribeAsync(Func filter, Func handler)` 方法,允许外部安全地订阅。

#### 📌 示例代码结构:

```csharp
public class SignalGenerator : IDisposable
{
public SignalGenerator(int intervalMs = 100) { }

public void Start();
public void Stop();

public void SubscribeAsync(Func filter, Func handler);

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` 替代传统 `EventHandler` |
| 多播委托与线程安全 | 如何安全地操作事件订阅与触发 |
| 定时器选择 | 使用 `System.Threading.Timer` 或 `PeriodicTimer` 实现后台定时任务 |
| 闭包和过滤器 | 每个订阅者绑定自己的过滤逻辑 |
| 并发执行 | 每个 handler 应该独立运行,不互相阻塞 |
| IDisposable 模式 | 正确释放资源,停止定时器 |
| 可测试性 | 是否能支持单元测试,比如虚拟时钟等 |

---

如果你需要这道题的标准实现代码或测试用例,我也可以提供。是否需要?

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

上一篇: c#题例-2025-07-27 19:58:40

下一篇: c#题例-2025-07-27 08:51:47

精华推荐