最新新闻:

世界上本没有进阶篇

时间: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

声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。

猜您喜欢

图文推荐

热点排行

精彩文章

热门推荐