怪奇物语

怪奇物语

首页 新随笔 联系 管理

回调函数 事件处理 dotnet .net 有界队列 背压机制(Backpressure)有界队列

通过有界队列来实现背压,确保生产者不会以超过消费者处理能力的速度发送数据。

using System.Threading.Channels;

public class Program
{
    static async Task Main(string[] args)
    {
        // 创建一个有界的消息队列,设置最大容量为5
        BoundedChannelOptions options = new BoundedChannelOptions(5)
        {
            FullMode = BoundedChannelFullMode.Wait, // 当队列满时,生产者等待
            SingleReader = true, // 该通道只有一个消费者
            SingleWriter = true // 该通道只有一个生产者
        };
        Channel<string> channel = Channel.CreateBounded<string>(options);

        // 启动消费者任务
        Task consumerTask = ConsumeMessagesAsync(channel.Reader);

        // 模拟生产者,尝试发送一些消息到队列
        while (true)
        {
            string? v = System.Console.ReadLine();
            if (!string.IsNullOrEmpty(v))
            {
                if (v == "q")
                {
                    channel.Writer.Complete();
                    await consumerTask;
                    break;
                }
                await WriteMessageAsync(channel.Writer, v);
                // Console.WriteLine($"Produced: {v}");
            }
        }
    }

    static async Task ConsumeMessagesAsync(ChannelReader<string> reader)
    {
        while (await reader.WaitToReadAsync())
        {
            while (reader.TryRead(out string item))
            {
                Console.WriteLine($"Consumed: {item}");
                await Task.Delay(100); // 模拟处理时间
            }
        }
    }

    static async Task WriteMessageAsync(ChannelWriter<string> writer, string message)
    {
        await writer.WriteAsync(message); // 生产者会在这里等待,直到有空间可用
    }
}

posted on 2025-01-23 08:00  超级无敌美少男战士  阅读(35)  评论(0)    收藏  举报