0

0

C#怎么使用BlockingCollection T C#生产者消费者模式实现

畫卷琴夢

畫卷琴夢

发布时间:2026-03-19 13:59:34

|

422人浏览过

|

来源于php中文网

原创

BlockingCollection<T>是C#中专为生产者-消费者模式设计的线程安全集合,基于IProducerConsumerCollection<T>实现阻塞、限容、取消及完成通知;支持多生产者多消费者并发操作,配合CompleteAdding()和GetConsumingEnumerable()可优雅退出。

c#怎么使用blockingcollection t c#生产者消费者模式实现

BlockingCollection<T> 是 C# 中专为生产者-消费者模式设计的线程安全集合,底层基于 IProducerConsumerCollection<T>(如 ConcurrentQueue<T>),自带阻塞、限容、取消支持,用起来简洁又可靠。

为什么选 BlockingCollection

它不是普通集合,而是“带闸门的容器”: - 生产者调用 Add() 时,若集合已满(设置了容量),会自动阻塞等待空位; - 消费者调用 Take() 时,若集合为空,会自动阻塞等待新项; - 支持 CompleteAdding() 通知“不再生产”,配合 IsCompletedGetConsumingEnumerable() 实现优雅退出; - 内置取消支持(可传 CancellationToken); - 默认使用 ConcurrentQueue,FIFO 语义,也可换 ConcurrentStack 或自定义队列。

基础实现:一个生产者 + 一个消费者

下面是最简可用示例,模拟日志写入场景:

var logs = new BlockingCollection<string>(boundedCapacity: 100);

// 生产者:异步生成日志
_ = Task.Run(() =>
{
    for (int i = 0; i < 500; i++)
    {
        logs.Add($"Log #{i} at {DateTime.Now:HH:mm:ss}");
        Thread.Sleep(10); // 模拟生产间隔
    }
    logs.CompleteAdding(); // 标记生产结束
});

// 消费者:逐条消费并打印
foreach (var log in logs.GetConsumingEnumerable())
{
    Console.WriteLine($"[CONSUMED] {log}");
}

多生产者 + 多消费者(真实场景)

实际中常需多个线程并发生产和消费。注意: - `BlockingCollection` 本身线程安全,无需额外加锁; - `GetConsumingEnumerable()` 在集合完成且为空时自动退出循环; - 建议显式捕获 `OperationCanceledException` 并处理取消逻辑。

var tasks = new List<Task>();
var messages = new BlockingCollection<string>(boundedCapacity: 50);

// 启动 3 个生产者
for (int p = 0; p < 3; p++)
{
    tasks.Add(Task.Run(() =>
    {
        var rnd = new Random();
        for (int i = 0; i < 100; i++)
        {
            messages.Add($"P{p}-Msg{i}");
            Thread.Sleep(rnd.Next(5, 20));
        }
    }));
}

// 启动 2 个消费者
for (int c = 0; c < 2; c++)
{
    tasks.Add(Task.Run(() =>
    {
        foreach (var msg in messages.GetConsumingEnumerable())
        {
            Console.WriteLine($"[C{c}] {msg}");
            Thread.Sleep(15); // 模拟处理耗时
        }
    }));
}

// 等所有生产者完成后再关闭
Task.WaitAll(tasks.Take(3).ToArray()); // 等前3个生产者
messages.CompleteAdding();

// 等所有任务结束
Task.WaitAll(tasks.ToArray());

带取消和超时的健壮写法

实际项目中建议加入取消令牌和超时控制,避免死等:

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));

try
{
    // 生产者(带取消)
    _ = Task.Run(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            messages.Add($"Item{i}", cts.Token);
            cts.Token.ThrowIfCancellationRequested();
        }
        messages.CompleteAdding();
    }, cts.Token);

    // 消费者(带取消 + 超时取值)
    foreach (var item in messages.GetConsumingEnumerable(cts.Token))
    {
        Console.WriteLine(item);
        // 可在此处做业务处理,也可用 cts.Token 判断是否该退出
    }
}
catch (OperationCanceledException)
{
    Console.WriteLine("操作被取消或超时");
}
catch (InvalidOperationException ex) when (ex.Message.Contains("completed"))
{
    Console.WriteLine("集合已标记完成,消费结束");
}

基本上就这些。BlockingCollection 把同步、阻塞、完成通知这些细节都封装好了,你只管专注“生产什么”和“消费怎么处理”,不复杂但容易忽略 CompleteAdding 和取消配合——这两点写对了,生产者消费者就稳了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

279

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

185

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

327

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

380

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

29

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

108

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

416

2026.03.11

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

381

2025.12.24

Go Web框架Gin接口开发与中间件设计实践
Go Web框架Gin接口开发与中间件设计实践

本专题围绕 Go 在 Web 后端开发中的主流框架 Gin 展开,系统讲解高性能接口开发与中间件机制设计。内容涵盖路由分组、请求绑定、参数校验、统一响应封装、日志与鉴权中间件实现,以及接口限流与异常处理策略。通过实战项目案例,帮助开发者构建结构清晰、性能优良的 Go Web 服务体系,提升接口开发效率与系统可维护性。

7

2026.03.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号