NetCore Channel-生产者&消费者

复制代码
using System.Threading.Channels;

namespace ChannelDemo
{
    public class ChannelMgr
    {
        // 优势
        // 允许开发者根据需要创建具有固定容量(有界)或无限容量(无界)的通道
        // 
        static Channel<string> channel = Channel.CreateBounded<string>(10); // 创建一个有界的通道,最大容量10条待处理消息(当通道满时,生产者将被阻塞,直到有空间可用。这种流控制可以对生产者进行阻塞,防止生产者过载,保护消费者不被淹没)
        //static Channel<string> channel = Channel.CreateUnbounded<string>(); // 创建一个无界通道,允许无限量的数据写入,直到系统的可用内存被耗尽

        //多种容量控制策略:对于有界通道,提供了Wait、DropNewest、DropOldest、DropWrite等多种策略来处理当通道达到容量上限时的情况

        static async Task Producer()
        {
            for (int i = 0; i < 30; i++)
            {
                string message = $"Message {i} -{DateTime.Now.ToString()}";
                await channel.Writer.WriteAsync(message); // 异步写入通道  
                Console.WriteLine($"Produced: {message}");
                await Task.Delay(100); // 模拟生产时间  
            }
            //channel.Writer.Complete(); // 标记通道为完成,不再写入数据,配合channel.Reader.WaitToReadAsync()->false,结束消费任务
            //Console.WriteLine("Write End");
        }

        static async Task Consumer()
        {
            while (await channel.Reader.WaitToReadAsync())
            {
                await foreach (var message in channel.Reader.ReadAllAsync()) // 异步读取所有消息  
                {
                    Console.WriteLine($"Consumed: {message}");
                    await Task.Delay(500); // 模拟处理时间  
                }
                await Task.Delay(10);
            }
            Console.WriteLine("Read End");
        }

        public static async Task StartConsumer()
        {
            // 启动消费者任务  
            Consumer();
        }

        public static async Task StartProducer()
        {
            // 启动生产者任务  
            Producer(); 
        }
    }
}
复制代码

 

posted @   CHHC  阅读(20)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示