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 ...
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。