C#面试题更新 2026-08-03

请描述在 C# 中利用 BufferBlock 对集合进行异步并行处理的具体实现方式。

考察说明

考查对 TPL Dataflow 中 BufferBlock 的理解及异步并行处理集合的能力。

回答思路

  1. 【回答框架 1】BufferBlock 是 System.Threading.Tasks.Dataflow 命名空间下的无界或有界缓冲区,基于生产者-消费者模式,支持异步写入和读取。通过 Post 或 SendAsync 发送数据,通过 ReceiveAsync 或 OutputAvailableAsync 异步接收。
  2. 【回答框架 2】实现异步并行处理时,可创建 BufferBlock 作为生产者,使用多个 ActionBlock 作为消费者,每个消费者通过链接(LinkTo)或循环接收数据,并在其中执行处理任务。通过设置 ExecutionDataflowBlockOptions 的 MaxDegreeOfParallelism 控制并行度。
  3. 【回答框架 3】生产者任务将集合中的每个元素异步写入 BufferBlock,写入完成后调用 Complete 方法通知下游不再有数据。消费者通过 await 处理每个元素,并最终等待所有消费任务完成。
  4. 【回答框架 4】为处理可能出现的异常,应捕获处理过程中的异常,并使用 Fault 或取消令牌(CancellationToken)来协调块的状态。可通过 TryReceive 或 OutputAvailableAsync 避免阻塞。
  5. 【关键点 1】BufferBlock 支持异步生产与消费,是 TPL Dataflow 的核心缓冲块。
  6. 【关键点 2】通过 LinkTo 连接消费者,或自行循环接收并处理。
  7. 【关键点 3】使用 ExecutionDataflowBlockOptions 设置并行度,如 MaxDegreeOfParallelism。
  8. 【关键点 4】生产者需调用 Complete,消费者需等待所有数据处理完毕。
  9. 【易错点 1】未调用 Complete 可能导致消费者永远等待。
  10. 【易错点 2】并行处理中未处理异常可能导致任务挂起或数据丢失。
  11. 【易错点 3】过度设置并行度可能导致资源竞争或性能下降。