c#题例-2025-06-13 00:52:24
日期: 2025-06-13 分类: AI写作 28次阅读
好的!以下是一道针对专家级别 C# 程序员的逻辑面试题,涉及多线程、性能优化和并发控制等高级主题:
---
### 面试题:实现一个高效的异步生产者-消费者模式
**问题描述:**
你需要设计一个高性能的生产者-消费者模型,其中生产者会不断地生成数据并放入队列中,而消费者则从队列中取出数据进行处理。为了确保系统的稳定性和高效性,请遵循以下要求:
1. **线程安全**:多个生产者和消费者可以同时运行,因此需要确保队列操作是线程安全的。
2. **异步支持**:生产者和消费者的操作应该是异步的,以避免阻塞主线程。
3. **性能优化**:尽量减少锁的竞争,提高吞吐量。
4. **限流机制**:如果队列已满,生产者应该暂停生产(即等待),直到队列中有足够的空间。
5. **取消机制**:提供一种机制,允许外部停止生产者和消费者的运行。
**具体要求:**
- 使用 `System.Collections.Concurrent` 或其他适当的 .NET 数据结构来实现线程安全的队列。
- 使用 `Task` 和 `async/await` 来实现异步操作。
- 提供一个示例代码,展示如何启动生产者和消费者,并在适当的时候停止它们。
- 在代码中添加注释,解释关键部分的逻辑。
---
### 示例答案框架(仅供参考):
```csharp
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class ProducerConsumer
{
private readonly BlockingCollection
private readonly int _maxQueueSize = 10; // 队列最大容量
private CancellationTokenSource _cts;
public ProducerConsumer()
{
_cts = new CancellationTokenSource();
}
// 生产者方法
public async Task ProduceAsync()
{
int counter = 0;
while (!_cts.Token.IsCancellationRequested)
{
try
{
// 如果队列已满,生产者会在这里等待
_queue.Add(counter++, _cts.Token);
Console.WriteLine($"Produced: {counter - 1}");
await Task.Delay(100, _cts.Token); // 模拟生产延迟
}
catch (OperationCanceledException)
{
Console.WriteLine("Producer stopped.");
break;
}
}
}
// 消费者方法
public async Task ConsumeAsync()
{
while (!_cts.Token.IsCancellationRequested)
{
try
{
// 从队列中取数据,如果没有数据会阻塞
int data = _queue.Take(_cts.Token);
Console.WriteLine($"Consumed: {data}");
await Task.Delay(200, _cts.Token); // 模拟消费延迟
}
catch (OperationCanceledException)
{
Console.WriteLine("Consumer stopped.");
break;
}
}
}
// 启动生产者和消费者
public void Start()
{
Task producerTask = ProduceAsync();
Task consumerTask = ConsumeAsync();
// 模拟运行一段时间后停止
Thread.Sleep(5000); // 运行5秒
Stop();
Task.WaitAll(producerTask, consumerTask);
}
// 停止生产者和消费者
public void Stop()
{
_cts.Cancel();
_queue.CompleteAdding(); // 标记队列不再添加新元素
}
public static void Main(string[] args)
{
var producerConsumer = new ProducerConsumer();
producerConsumer.Start();
}
}
```
---
### 考察点:
1. **线程安全**:是否正确使用了 `BlockingCollection` 或其他线程安全的数据结构。
2. **异步编程**:是否合理使用了 `async/await` 和 `CancellationToken`。
3. **性能优化**:是否考虑了锁的竞争问题(如使用 `BlockingCollection` 的无锁特性)。
4. **限流机制**:是否实现了队列满时的等待逻辑。
5. **取消机制**:是否提供了优雅的停止方式。
希望这道题目能够很好地考察候选人的 C# 编程能力和并发处理经验!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐