c#题例-2025-06-14 23:45:30
日期: 2025-06-14 分类: AI写作 22次阅读
好的!以下是一道专家级别的 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
public int Calculate(int input)
{
return GetOrAddTask(input).Result; // 阻塞直到任务完成
}
private Task
{
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
标签:AI写作
精华推荐