前言

该系列为异步编程的进阶篇,其实也不能这么讲。世界上本没有进阶篇,只能说是高级篇(高级篇不能说多高级,是对底层的封装的意思),只要是加深理解都是进阶。

本章先介绍一下channel。

正文

下面没什么好说的,把文档贴一下。

https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.channels?view=net-6.0

Channels 是做什么的呢?

提供用于在生成者和使用者之间以异步方式传递数据的一组同步数据结构。

这里面有同步又有异步,到底该怎么理解呢?

首先这里面有生成者和使用者两个概念。

那么怎么理解同步数据呢? 就是说使用者是按照生成者的生成数据顺序进行使用的。

然后这个异步方式传递数据是怎么回事呢? 那就是说比如生成者生产了一条消息,然后使用者使用了,然后生产者才能继续生成,那么就是同步,反之就是异步。

为什么用同步来举例,然后反之就是异步呢? 因为异步的情况太多了。

那么这里就解释完了。

然后这里要说明一点的就是有些初学者难理解这里说的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 多了两个东西。

里面就是限制管道中的最大消息数,另一个就是如果到达消息数后,怎么处理的问题。

处理方式有很多种:

然后思考一个问题,那就是为什么要限制里面的消息数。

这里面和缓存一个道理,比如说不断的往里面加入消息数,且消费者无法消费完,然后内存就会不断的升高,因为我们的内存有限,不然做到无限缓存。

而且还有一个问题,那就是如果消费不完,然后不断往里面增加数据还会增加io成本,所以说应该考虑自己的消费情况,来设置最大消息数。

channel 提供了有边界选项,同样也提供了无边界的UnboundedChannelOptions 。

这里有人就会问了, 为啥要无边界的,上面不是说要设置有边界的,无边界不是会有问题吗?

是的,无边界的确会有问题。

这个无边界的选择意思是让你自己控制生产速度。

举个例子,比如说你需要进行对流量控制,每条消息的大小都不一样,那么这个时候你对消息数进行限制,就是达不到效果的。

这里要说明的无边界不是真的让你放飞自我。如果你肯定消费者一定能达到预期的消费,那么你也可以不限制,但是最好不要这么做。

因为channel 毕竟是单台机器的使用, 不像kafka这种集群模式的,具备很大的存储能力。仅个人建议,如有不同想法可以交流一下。

channel 这个类,就是一个构造器,创建有边界的channel 和无边界的。

创建出来的channel 有 读取器和写入器:

至于例子,在网上找了一个例子:

using System.Threading.Channels;

var channel = Channel.CreateUnbounded<int>();

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,到时候可以交流一下。

该系列不断更新,主要是介绍一下一些异步编程高级部分(不是指内容多高级而是指上层应用),内容偏设计方面,实战例子会在后面的开源中体现。

c# 异步进阶————channel [一]的更多相关文章

  1. 异步Async

    1.c#异步介绍 异步必须基于委托,有委托才有异步 新建一个window Form程序MyAsync,添加一个按钮,(name)=btnAsync 后台代码如下: using System;using ...

  2. Dotnet Core下的Channel, 你用了吗?

    今天给大家分享一个微软官方的好东西:Channel.   前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在System.Threading.Chann ...

  3. nio简介

    上一篇  Java I/O演进与Linux网络I/O模型 一.传统BIO java传统bio编程概念: http://www.cnblogs.com/carl10086/p/6034563.html# ...

  4. netty(三) 组件介绍

    netty各组件说明:channel ----- SocketEventLoop -------控制流,多线程处理,并发channelFuture ------- 异步通知 channel:主要是实现 ...

  5. Netty5服务端源码解析

    Netty5源码解析 今天让我来总结下netty5的服务端代码. 服务端(ServerBootstrap) 示例代码如下: import io.netty.bootstrap.ServerBootst ...

  6. Java NIO系列教程(八)JDK AIO编程

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  7. RabbitMQ事物模式

    Rabbit的消息确认机制(事务+confirm)在rabbmitmq中我们可以通过持久化数据解决rabbitmq服务器异常的数据丢失问题问题:生产者将消息发送出去之后消息到底有没有到达rabbitm ...

  8. Netty实战 - 1. 基本概念

    1. Netty简介 Netty是由JBOSS提供的一个java开源框架.它提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.Netty是一个基于NI ...

  9. RabbitMQ消息发布时的权衡

    在进行本篇文章的学习之前,你需要先阅读 https://www.cnblogs.com/duanjt/p/10057330.html.以便对Java访问RabbitMQ的基础用法有所了解. 一.失败通 ...

随机推荐

  1. LVGL库入门教程03-布局方式

    LVGL布局方式 LVGL的布局 上一节介绍了如何在 LVGL 中创建控件.如果在创建控件时不给控件安排布局,那么控件默认会被放在父容器的左上角. 可以使用 lv_obj_set_pos(obj, x ...

  2. Linux云服务器 磁盘分区失败

    背景:阿里云服务器,df -h  /dev/vda1有40g,然后想把这40g拆一下,拆成几个分区,挂载到不同的路径下. 行动:需要先卸载挂载的盘,但是umount失败,通过fuser删除盘上的服务失 ...

  3. JS:条件语句3

    1.while while 语句只要指定条件为 true,就会执行循环. 语法: while(条件){ 语句: } 例: var i = 0; while (i < 5) { console.l ...

  4. C# · 委托语句简化演变

    1.委托基础语句形式 namespace QLVision { delegate void dHelp();//定义委托 static class Program { /// <summary& ...

  5. 20行python代码,轻松获取各路小说,非常简单

    哔哔两句 作为现代青年,我相信应该没几个没看过小说的吧,嘿嘿~ 一般来说咱们书荒的时候怎么办?自然是去起某点排行榜先找到小说名字,然后再找度娘一搜,哎 ,笔趣阁就出来答案了,美滋滋~但是那多麻烦,咱们 ...

  6. HTML知识点概括——一篇文章带你完全掌握HTML

    HTML知识点概括 前端三件套分别是HTML3,CSS5,JavaScript 稍微介绍一下W3C标准: 结构化标准语言(HTML) 表现标准语言(CSS) 行为标准(DOM,JavaScript) ...

  7. 0基础就可以上手的Spark脚本开发-for Java

    前言 最近由于工作需要,要分析大几百G的Nginx日志数据.之前也有过类似的需求,但那个时候数据量不多.一次只有几百兆,或者几个G.因为数据都在Hive里面,当时的做法是:把数据从Hive导到MySQ ...

  8. 5-4 Sentinel 限流_流控与降级

    Sentinel 介绍 什么是Sentinel Sentinel也是Spring Cloud Alibaba的组件 Sentinel英文翻译"哨兵\门卫" 随着微服务的流行,服务和 ...

  9. 07 MySQL_事务

    事务 事务( transaction) 是数据库中执行同一业务多条SQL语句 工作单元,事务可以保证多条SQL语句全部执行成功或全部执行失败 和事务相关的SQL语句: 验证事务: 1. 创建表: cr ...

  10. DongDong认亲戚 来源:牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28886/1021 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...