2024-08-05 · C# 基础 · 学习笔记

Channel 生产者消费者

System.Threading.Channels 是 .NET Core 提供的进程内异步消息队列,适合生产者消费者模式。比 BlockingCollection 更现代,全面支持 async/await。

典型场景:后台任务接收多个 Web 请求产生的工作项,逐个处理。BoundedChannel 可以限制容量,满了生产者等待,防止内存爆掉。

注意事项:1) 用完要 CompleteWriter,否则 reader 会一直等;2) 读用 ReadAllAsync 或 ReadAsync;3) 多生产者多消费者安全。

代码示例

using System.Threading.Channels;

// 创建有界通道(容量100)
var channel = Channel.CreateBounded<string>(new BoundedChannelOptions(100)
{
    FullMode = BoundedChannelFullMode.Wait
});

// 生产者:写入
_ = Task.Run(async () =>
{
    for (int i = 0; i < 10; i++)
    {
        await channel.Writer.WriteAsync($"消息 {i}");
        await Task.Delay(100);
    }
    channel.Writer.Complete(); // 标记完成
});

// 消费者:读取
await foreach (var msg in channel.Reader.ReadAllAsync())
{
    Console.WriteLine($"收到:{msg}");
}
// 输出:消息 0, 1, 2 ...
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。