Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-14 23:45:30

好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、并发和性能优化等高级概念:

---

### **题目:**

假设你正在开发一个高性能的 Web 服务,该服务需要处理大量的并发请求。每个请求都会调用一个耗时的计算方法 `ExpensiveCalculation(int input)`,并且这个方法的结果可能会被多个请求重复使用。为了提高性能,你需要实现一个缓存机制,确保相同的输入只计算一次,并且结果可以被共享。

**要求:**
1. 缓存必须是线程安全的。
2. 如果某个输入的结果已经在计算中(但尚未完成),其他线程应该等待,而不是重新启动计算。
3. 实现一个类 `CachedCalculator`,包含以下方法:
- `int Calculate(int input)`:根据输入值返回计算结果。如果结果已经在缓存中,则直接返回;如果结果正在计算中,则等待计算完成并返回;如果结果尚未计算,则启动计算并缓存结果。
4. 使用 C# 的并发工具(如 `ConcurrentDictionary`、`Task`、`SemaphoreSlim` 等)来实现。

**提示:**
- 考虑如何避免死锁或资源竞争。
- 你可以假设 `ExpensiveCalculation(int input)` 是一个黑盒方法,无法修改其内部实现。

---

### **参考答案思路:**

以下是可能的实现方式:

```csharp
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

public class CachedCalculator
{
private readonly ConcurrentDictionary> _cache = new ConcurrentDictionary>();

public int Calculate(int input)
{
return GetOrAddTask(input).Result; // 阻塞直到任务完成
}

private Task GetOrAddTask(int input)
{
return _cache.GetOrAdd(input, key => Task.Run(() => ExpensiveCalculation(key)));
}

private int ExpensiveCalculation(int input)
{
// 模拟耗时计算
Console.WriteLine($"Starting calculation for input: {input}");
Task.Delay(2000).Wait(); // 模拟延迟
Console.WriteLine($"Finished calculation for input: {input}");
return input * input; // 示例计算
}
}

// 测试代码
public class Program
{
public static void Main()
{
var calculator = new CachedCalculator();

Parallel.For(0, 5, i =>
{
Console.WriteLine($"Thread {i} result: {calculator.Calculate(10)}");
});
}
}
```

---

### **考察点:**
1. **线程安全**:是否正确使用了 `ConcurrentDictionary` 来保证多线程环境下的数据一致性。
2. **任务并行性**:是否能够利用 `Task` 和异步编程模型来避免阻塞主线程。
3. **性能优化**:是否能够有效减少重复计算,同时避免不必要的等待。
4. **代码可读性与扩展性**:是否考虑到了未来的维护和扩展需求。

希望这道题能够帮助你评估候选人的高级技能!

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

上一篇: c#题例-2025-06-15 05:18:51

下一篇: c#题例-2025-06-14 18:12:09

精华推荐