System.Threading.Channels 高性能异步队列

这篇具有很好参考价值的文章主要介绍了System.Threading.Channels 高性能异步队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

System.Threading.Channels 是.NET Core 3.0 后推出的新的集合类型, 具有异步API,高性能,线程安全等特点,它提供一个异步数据集合,可用于生产者和消费者之前的数据异步传递。

它提供如下方法:

BoundedChannelOptions

Provides options that control the behavior of bounded Channel<T> instances.

提供通道的行为控制 有限通道

Channel

Provides static methods for creating channels.

提供创建通道的静态方法

Channel<T>

Provides a base class for channels that support reading and writing elements of type T.

泛型通道,写入和读取方类型都为 T

Channel<TWrite,TRead>

Provides a base class for channels that support reading elements of type TRead and writing elements of type TWrite.

泛型通道,分别指定写入和读取方的类型

ChannelClosedException

Exception thrown when a channel is used after it's been closed.

通道在关闭后被调用时会抛出此异常

ChannelOptions

Provides options that control the behavior of channel instances.

提供通道的行为控制

ChannelReader<T>

Provides a base class for reading from a channel.

通道读取方的基类

ChannelWriter<T>

Provides a base class for writing to a channel.

通道写入方的基类

UnboundedChannelOptions

Provides options that control the behavior of unbounded Channel

提供通道的行为控制 无限制通道

BoundedChannelFullMode

Specifies the behavior to use when writing to a bounded channel that is already full.

当通道容量达到最大时 控制通道的写入规则 有限通道

静态类 Channel

通道的创建方法由静态类Channel提供,只需要指定通道类型、控制条件和数据类型

CreateBounded<T>(BoundedChannelOptions)

Creates a channel with the specified maximum capacity.

创建具有指定配置的通道

CreateBounded<T>(BoundedChannelOptions, Action<T>)

Creates a channel subject to the provided options.

通道容量已满,再写入时会触发Action<T>

CreateBounded<T>(Int32)

Creates a channel with the specified maximum capacity.

创建具有指定容量的通道

CreateUnbounded<T>()

Creates an unbounded channel usable by any number of readers and writers concurrently.

创建无限制通道,可供任意数量的读取和写入方同时操作

CreateUnbounded<T>(UnboundedChannelOptions)

Creates an unbounded channel subject to the provided options.

创建具有指定配置的无限制通道

BoundedChannelFullMode

DropNewest 1

删除并忽略通道中的最新项,以便为要写入的项留出空间。

DropOldest 2

删除并忽略通道中的最旧项,以便为要写入的项留出空间。

DropWrite 3

删除要写入的项。

Wait 0

等待空间可用以便完成写入操作。

 ChannelOption

AllowSynchronousContinuations 如果通道上执行的操作能以同步方式调用已订阅挂起异步操作的通知的延续,则为 true;如果应以异步方式调用所有延续,则为 false
SingleReader

如果通道中的读取器需要保证一次最多仅执行一个读取操作,则为 true;如果不需要此类约束,则为 false

SingleWriter

如果写入到通道的编写器需要保证一次最多仅执行一个写入操作,则为 true;如果不需要此类约束,则为 false

BoundedChannelOptions

BoundedChannelOptions(int Capcity)

初始化选项。

AllowSynchronousContinuations

如果通道上执行的操作能以同步方式调用已订阅挂起异步操作的通知的延续,则为 true;如果应以异步方式调用所有延续,则为 false

(继承自 ChannelOptions)
Capacity

获取或设置有限通道可能会存储的最大项数。

FullMode

获取或设置通道已满时由写入操作引起的行为。BoundedChannelFullMode枚举

SingleReader

如果通道中的读取器需要保证一次最多仅执行一个读取操作,则为 true;如果不需要此类约束,则为 false

(继承自 ChannelOptions)
SingleWriter

如果写入到通道的编写器需要保证一次最多仅执行一个写入操作,则为 true;如果不需要此类约束,则为 false

(继承自 ChannelOptions)

 UnBoundedChannelOptions

AllowSynchronousContinuations 如果通道上执行的操作能以同步方式调用已订阅挂起异步操作的通知的延续,则为 true;如果应以异步方式调用所有延续,则为 false
SingleReader

如果通道中的读取器需要保证一次最多仅执行一个读取操作,则为 true;如果不需要此类约束,则为 false

SingleWriter

如果写入到通道的编写器需要保证一次最多仅执行一个写入操作,则为 true;如果不需要此类约束,则为 false

Writer

Complete(Exception)

Mark the channel as being complete, meaning no more items will be written to it.

标记通道即将关闭,意味着没有更多的数据需要写入

TryComplete(Exception)

Attempts to mark the channel as being completed, meaning no more data will be written to it.

尝试关闭通道,意味着没有更多的数据需要写入,成功返回 true,反之false

TryWrite(T)

Attempts to write the specified item to the channel.

尝试写入数据,成功返回 true ,反之 false

WaitToWriteAsync(CancellationToken)

Returns a ValueTask<TResult> that will complete when space is available to write an item.

将等待有可用空间写入项时完成写入并返回 true, 或在通道关闭后返回 false

WriteAsync(T, CancellationToken)

Asynchronously writes an item to the channel.

Reader

ReadAllAsync(CancellationToken)

Creates an IAsyncEnumerable<T> that enables reading all of the data from the channel.创建的异步可枚举项

ReadAsync(CancellationToken)

Asynchronously reads an item from the channel.

TryPeek(T)

Attempts to peek at an item from the channel.

TryRead(T) 如果项已读取到,则为 true;否则为 false
WaitToReadAsync(CancellationToken)

它将在有数据可供读取时完成,并返回 true 结果;或将在因通道成功完成而不再有数据可供读取时完成,并返回 false 结果

示例

// 创建有限容量的channel 
var channel1 = Channel.CreateBounded<string>(100);

var option = new BoundedChannelOptions(100) 
{ 
    FullMode = BoundedChannelFullMode.Wait//容量满时,等待空位再写入 
};
// 创建指定配置的有限通道
var channel2 = Channel.CreateBounded<string>(option);

await channel.Writer.WriteAsync("hello");//写入
string res = await channel.Reader.ReadAsync();//读取

//自动循环读取,内部阻塞,当写入方调用Complete时,会自动退出循环
await foreach(var item in channel.Reader.ReadAllAsync())
{
    Console.WriteLine(item); 
}

//捕获到异常 退出
try
{
    while(!channel.Reader.Completion.IsCompleted)
    {
        var message = await channel.Reader.ReadAsync();
        Console.WriteLine(message);
    }
}
catch(ChannelClosedException)
{
    Console.WriteLine("channel closed");
}

有意思的是当写入方Writer调用Complete方法时,Reader.Completion.Completed并不会立即被标记,而是通道内没有数据时再被标记。

此外,当写入方Writer调用Complete方法时,await foreach会自动退出循环。但上述第二种读取方式会报错ChannelClosedException,需要Try Catch包起来。

.Net Framework 4.8 没有ReadAllAsync方法,ReadAkkAsync的实现其实是:

while (await channel.Reader.WaitToReadAsync())
{
    while (channel.Reader.TryRead(out var item))
    {
        Console.WriteLine(item);
    }
}

可以用上述方式避免报错。文章来源地址https://www.toymoban.com/news/detail-821717.html

到了这里,关于System.Threading.Channels 高性能异步队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【消息队列】Kafka如何实现高性能IO

    【消息队列】Kafka如何实现高性能IO

    我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步同步方式发送,采用高效的压缩算法,高效的序列化方式,以及网络IO等。那么Kafka主要

    2023年04月13日
    浏览(13)
  • 深入详解高性能消息队列中间件 RabbitMQ

    深入详解高性能消息队列中间件 RabbitMQ

      目录 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++软件异常排查从入

    2024年02月05日
    浏览(49)
  • 解析RocketMQ:高性能分布式消息队列的原理与应用

    什么是消息队列 消息队列是一种消息传递机制,用于在应用程序和系统之间传递消息,实现解耦和异步通信。它通过将消息发送到一个中间代理(消息队列),然后由消费者从该队列中获取消息并处理。 RocketMQ简介 RocketMQ是阿里巴巴开源的一款高性能分布式消息队列系统。它

    2024年02月14日
    浏览(13)
  • RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

    RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

    RocketMQ on openEuler,是一种将 RocketMQ 消息中间件通过容器化的方式部署在 openEuler 操作系统上运行,借助 openEuler 系统对于 OS 缓存回收效率增强的内核特性,提升消息中间件在面向超大规模高并发、高吞吐量、低延迟场景下稳定性和可靠性的软件解决方案。 移动云 RocketMQ 消息

    2024年02月11日
    浏览(16)
  • Unity中的异步编程【5】——在Unity中使用 C#原生的异步(Task,await,async) - System.Threading.Tasks

    Unity中的异步编程【5】——在Unity中使用 C#原生的异步(Task,await,async) - System.Threading.Tasks

    1、System.Threading.Tasks中的Task是.Net原生的异步和多线程包。 2、UniTask(Cysharp.Threading.Tasks)是仿照.Net原生的Task,await,async开发的一个包,该包专门服务于Unity,所以取名UnityTask,简称UniTask。 3、既然有Task了,为啥还要搞一个UniTask (1)Task可以用在PC和Android上,但是在WebGL上则会

    2023年04月17日
    浏览(14)
  • 《高性能MySQL》——创建高性能的索引(笔记)

    《高性能MySQL》——创建高性能的索引(笔记)

    索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。 在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时

    2024年02月07日
    浏览(49)
  • 【Linux高性能服务器编程】——高性能服务器框架

    【Linux高性能服务器编程】——高性能服务器框架

      hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之高性能服务器框架介绍,在这篇文章中, 你将会学习到高效的创建自己的高性能服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇

    2024年04月25日
    浏览(47)
  • 读高性能MySQL(第4版)笔记09_创建高性能索引(下)

    读高性能MySQL(第4版)笔记09_创建高性能索引(下)

    1.4.4.1. InnoDB的二级索引在叶子节点中保存了记录的主键值,所以如果二级索引能够覆盖查询,则可以避免对主键索引的二次查询 7.1.5.1. 常见的类似错误通常是由于尝试使用rsync备份InnoDB导致的 7.3.3.1. 否则,对于范围查询、索引覆盖扫描等操作来说,速度可能会降低很多 7

    2024年02月08日
    浏览(47)
  • 读高性能MySQL(第4版)笔记08_创建高性能索引(上)

    读高性能MySQL(第4版)笔记08_创建高性能索引(上)

    2.4.2.1. 按照索引列中的数据大小顺序存储的 2.4.3.1. 键前缀查找只适用于根据最左前缀的查找 2.4.4.1. 在查询某些条件的数据时,存储引擎不再需要进行全表扫描 2.4.4.2. 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中

    2024年02月08日
    浏览(49)
  • 《高性能MYSQL》-- 查询性能优化

    《高性能MYSQL》-- 查询性能优化

    查询性能优化 深刻地理解MySQL如何真正地执行查询,并明白高效和低效的原因何在 查询的生命周期(不完整):从客户端到服务器,然后服务器上进行语法解析,生成执行计划,执行,并给客户端返回结果。 一条查询,如果查询得很慢,原因大概率是访问的数据太多 对于低

    2024年03月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包