时间:2022-09-05 10:01:56来源:网络整理
前言
本系列是异步编程进阶篇,其实不能说。世界上没有进阶篇,只能说是进阶篇(进阶篇不能说更进阶,就是对底层的封装),只要是加深理解,很高级。
本章首先介绍渠道。
文字
下面没什么好说的,发文档吧。
/en-us/dotnet/api/system.threading.channels?view=net-6.0
频道做什么?
提供一组同步数据结构,用于在生产者和消费者之间异步传递数据。
有同步和异步之分,如何理解?
首先,有生成器和用户两个概念。
那么你如何理解同步数据呢?也就是说,用户按照生成器生成数据的顺序使用数据。
这种异步传递数据的方式是怎么回事?也就是说,比如生产者产生一条消息,然后消费者使用它c#生产消费者问题,然后生产者可以继续产生,那么就是同步的,否则就是异步的。
为什么以同步为例,反之则为异步?因为异步的情况太多了。
那么说明到此结束。
那么这里要说明的一点是,有些初学者很难理解这里所说的channel是一个数据结构。里面没有方法吗?
先说一下数据结构的含义:
A data structure is a storage that is used to store and organize data. It is a way of arranging data on a computer so that it can be accessed and updated efficiently.
数据结构是一种用于存储和组织数据的内存。然后使用一种组织数据的方法来访问和更新数据。
所以数据结构不仅仅是用于存储,它们还具有组织数据的能力。
例如,我们的数组和集合都是数据结构。其实有两个特点,一个是存储,一个是组织。
那么里面就有了上面的类。
看第一课:
BoundedChannelOptions 继承自 channelOptions。
那就先看看channelOptions吧。
除了AllowSynchronousContinuations,其他的意思都很清楚,就不看了。这个 AllowSynchronousContinuations 很混乱,后面我练习的时候再看。
BoundedChannelOptions 表面上是有界配置,比channeloptions多两个东西。
里面是限制管道中的最大消息数c#生产消费者问题,另一个是达到消息数时处理问题。
有很多方法来处理它:
然后想一个问题,这就是为什么要限制其中的消息数量。
缓存是有原因的。比如不断往里面添加消息的数量,而消费者不能消费,那么内存会不断增加,因为我们的内存是有限的,否则可以实现无限缓存。
还有一个问题,就是如果消费没有结束,然后不断往里面添加数据会增加io开销,所以要考虑自己的消费情况来设置最大消息数。
channel 提供有界选项以及无界 UnboundedChannelOptions。
这里有人会问,为什么要无边框,上面没说要设置边框,是不是没有边框有问题?
是的,无边界确实有问题。
此无边界选项旨在让您控制生产速度。
比如,比如你需要控制流量,而每条消息的大小不一样,那么此时如果限制消息的数量,就达不到效果了。
这里所说的无限并没有真正让你自由。如果你确定消费者会达到预期消费,那么你也可以不限制,但最好不要这样做。
因为通道毕竟是单机使用的,不像kafka的集群模式,存储容量很大。纯属个人建议,如有不同意见,可以分享。
channel 这个类是创建有界和无界通道的构造函数。
创建的频道有读者和作者:
举个例子,我在网上找到了一个例子:
using System.Threading.Channels;
var channel = Channel.CreateUnbounded();
Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(TimeSpan.FromMilliseconds(200));
await channel.Writer.WriteAsync(i);// 生产者写入消息
if (i > 5)
{
channel.Writer.Complete(); //生产者也可以明确告知消费者不会发送任何消息了
}
}
});
Task.Run(async () =>
{
await foreach (var item in channel.Reader.ReadAllAsync())//async stream,在没有被生产者明确Complete的情况下,这里会一致阻塞下去
{
Console.WriteLine(item);
}
Console.WriteLine("done");
});
Console.ReadKey();
这个例子比较简单。后面会写一个kafka批量消费库,就是用这个channel,到时候可以通信。
结束
本系列不断更新,主要介绍异步编程的一些高级部分(不是指高层内容,而是上层应用)。内容偏设计,后面会在开源中体现实际例子。
来自:./aoximin
声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。
图文推荐
2022-09-05 10:01:40
2022-09-05 10:01:33
2022-09-05 08:10:17
2022-09-04 11:01:51
2022-09-04 08:10:17
2022-09-03 12:01:21
热点排行
精彩文章
2022-09-05 09:02:44
2022-09-04 14:02:05
2022-09-04 10:01:54
2022-09-03 14:01:25
2022-09-03 12:01:55
2022-09-03 11:01:37
热门推荐