Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-20 01:19:28

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

---

### 面试题:实现一个高效的异步生产者-消费者模式

#### 背景:
你需要设计一个生产者-消费者模型,其中多个生产者线程向一个共享队列中添加数据,而多个消费者线程从该队列中取出数据进行处理。为了提高性能和资源利用率,要求使用异步编程模型(`async/await`)以及 C# 的并发集合类。

#### 要求:
1. **线程安全**:确保在多线程环境下,生产者和消费者能够安全地访问共享队列。
2. **高性能**:尽量减少锁的使用,利用 C# 提供的并发集合类(如 `ConcurrentQueue` 或 `BlockingCollection`)来优化性能。
3. **异步支持**:生产者和消费者的操作必须支持异步调用,以避免阻塞主线程。
4. **背压机制**:当队列中的元素数量达到一定阈值时,生产者应暂停生产,直到消费者消费了一部分数据。
5. **取消机制**:提供一种方式,允许外部通过 `CancellationToken` 来取消生产者和消费者的任务。

#### 示例代码框架:
以下是问题的代码框架,你需要补充完整实现:

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

public class ProducerConsumer
{
private readonly BlockingCollection _queue = new BlockingCollection();
private readonly int _maxQueueSize = 100; // 队列最大容量
private readonly CancellationTokenSource _cts = new CancellationTokenSource();

public async Task ProduceAsync(int producerId, CancellationToken token)
{
// 补充实现:生产者逻辑
}

public async Task ConsumeAsync(int consumerId, CancellationToken token)
{
// 补充实现:消费者逻辑
}

public void Start()
{
var producers = new List();
var consumers = new List();

for (int i = 0; i < 5; i++) // 启动5个生产者
{
producers.Add(ProduceAsync(i, _cts.Token));
}

for (int i = 0; i < 3; i++) // 启动3个消费者
{
consumers.Add(ConsumeAsync(i, _cts.Token));
}

Task.WaitAll(producers.ToArray());
_queue.CompleteAdding(); // 告知消费者不再有新数据
Task.WaitAll(consumers.ToArray());

Console.WriteLine("所有任务完成!");
}

public void Cancel()
{
_cts.Cancel(); // 取消所有任务
}
}

class Program
{
static async Task Main(string[] args)
{
var producerConsumer = new ProducerConsumer();
producerConsumer.Start();

await Task.Delay(10000); // 模拟运行10秒
producerConsumer.Cancel();
}
}
```

#### 提示:
1. 使用 `BlockingCollection` 的 `Add` 和 `Take` 方法来实现线程安全的队列操作。
2. 利用 `CancellationToken` 来检测取消信号,并在必要时抛出 `OperationCanceledException`。
3. 在生产者中实现背压机制,可以通过检查 `_queue.Count` 或使用 `BlockingCollection.CompleteAdding()` 来限制队列大小。

#### 扩展问题:
1. 如果需要支持优先级队列,该如何修改当前的设计?
2. 如何监控队列的状态(如当前大小、生产者/消费者的吞吐量)?

---

这道题目考察了候选人对多线程编程、异步编程、并发集合类以及性能优化的理解,非常适合专家级别的 C# 程序员面试。

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

上一篇:无

下一篇: c#题例-2025-06-19 19:45:48

精华推荐