Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-07-10 21:58:30

当然可以!以下是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **委托、泛型、异步编程、闭包捕获与线程安全**等多个高级概念:

---

### 🧠 面试题:异步委托链与状态管理

#### 题目描述:

你被要求实现一个名为 `AsyncPipeline` 的通用异步处理管道类。该类应支持将多个异步函数(`Func>`)串联起来形成一个处理链,并按顺序执行这些函数。

此外,每个函数在执行时都应该能够访问并修改一个共享的上下文对象(类型为 `Dictionary`),但不能通过参数显式传递这个上下文。也就是说,每个处理函数都应该是 `Func>` 类型,不允许更改其签名。

你需要设计整个管道的结构,包括如何让每个函数访问到共享上下文,同时保证线程安全。

---

#### 要求功能如下:

1. 支持添加多个 `Func>` 到处理链中。
2. 每个函数执行时都能读写一个共享的上下文(`Dictionary`),但不通过参数显式传入。
3. 整个链是异步执行的。
4. 多个请求并发调用此管道时,上下文必须隔离,即不同调用之间不能互相干扰。
5. 请提供使用示例和测试代码。

---

#### 示例:

```csharp
var pipeline = new AsyncPipeline();

pipeline.Add(async x =>
{
// 可以访问共享上下文,比如设置一个值
ContextStore.Current["counter"] = x;
await Task.Delay(10);
return x * 2;
});

pipeline.Add(async x =>
{
// 获取之前设置的值
var counter = (int)ContextStore.Current["counter"];
Console.WriteLine($"Counter was {counter}");
await Task.Delay(10);
return x + counter;
});

// 执行管道
int result = await pipeline.ExecuteAsync(5);
Console.WriteLine(result); // 应输出 15(5*2 + 5)
```

---

### ✅ 考察点:

- 对 `async/await` 和线程上下文的理解(如 `AsyncLocal` 的使用)
- 使用 `委托链` 构建可扩展的处理流程
- 泛型编程能力
- 闭包变量捕获问题
- 线程安全与上下文隔离
- 设计模式理解(责任链 / 中间件模式)

---

### 💡 提示:

- 可以使用 `AsyncLocal>` 来保存当前请求的上下文。
- 注意不要使用 `ThreadStatic` 或 `CallContext`(后者在 .NET Core 已弃用)。
- 实现一个静态类 `ContextStore`,包含 `Current` 属性来获取当前上下文。
- 在 `ExecuteAsync` 中构建委托链,依次应用所有 `Func>`。

---

如果你需要这道题的参考答案或实现思路,我可以继续为你详细解析。是否需要?

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

上一篇: c#题例-2025-07-11 03:31:48

下一篇: c#题例-2025-07-10 16:25:08

精华推荐