C# Channel

  • 核心概念
  • 创建Channel
    • 无界通道
    • 有界通道
      • `FullMode`选项
  • 生产者-消费者模式
    • 生产者写入数据
    • 消费者读取数据
  • 完整示例
  • 高级配置
    • 优化选项:
    • 取消操作:通过 `CancellationToken` 取消读写。
  • 错误处理
  • 适用场景
  • `Channel`的类型
  • 创建`Channel`
  • 写入和读取消息
  • 使用场景
  • 示例代码
  • 注意事项

C#中, System.Threading.Channels 提供了 高效的异步生产-消费模型,适用于多任务间的数据传递。以下是其核心概念及使用方法的总结:

核心概念

Channel<T>:异步消息队列,支持多生产者和多消费者。

ChannelWriter<T>:用于异步写入数据(WriteAsync),完成后需调用 Complete()

ChannelReader<T>:用于异步读取数据,支持 ReadAsyncReadAllAsync 遍历。

创建Channel

无界通道

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

容量无限,适用于不确定数据量的场景。

有界通道

var options = new BoundedChannelOptions(10)
{FullMode = BoundedChannelFullMode.Wait // 满时等待
};
var channel = Channel.CreateBounded<int>(options);

FullMode选项

  • Wait(默认):写入时阻塞直到有空间。

  • DropOldest/DropNewest:丢弃最旧/最新数据。

  • DropWrite:丢弃当前写入的数据。

生产者-消费者模式

生产者写入数据

async Task Producer(ChannelWriter<int> writer)
{for (int i = 0; i < 10; i++){await writer.WriteAsync(i);await Task.Delay(100);}writer.Complete(); // 标记完成
}

消费者读取数据

async Task Consumer(ChannelReader<int> reader)
{// 方式1: ReadAllAsync遍历await foreach (var item in reader.ReadAllAsync()){Console.WriteLine($"Received: {item}");}// 方式2: 手动循环while (await reader.WaitToReadAsync()){while (reader.TryRead(out var item)){Console.WriteLine($"Received: {item}");}}
}

完整示例

using System;
using System.Threading.Channels;
using System.Threading.Tasks;class Program
{static async Task Main(){var channel = Channel.CreateUnbounded<int>();var producer = Producer(channel.Writer);var consumer = Consumer(channel.Reader);await Task.WhenAll(producer, consumer);}static async Task Producer(ChannelWriter<int> writer){try{for (int i = 0; i < 10; i++){await writer.WriteAsync(i);await Task.Delay(100);}}catch (Exception ex){writer.Complete(ex); // 传递异常}finally{writer.Complete();}}static async Task Consumer(ChannelReader<int> reader){try{await foreach (var item in reader.ReadAllAsync()){Console.WriteLine($"Processed: {item}");}}catch (Exception ex){Console.WriteLine($"Error: {ex.Message}");}}
}

高级配置

优化选项:

var options = new UnboundedChannelOptions()
{SingleWriter = true,  // 单一生产者优化SingleReader = false  // 允许多消费者
};

取消操作:通过 CancellationToken 取消读写。

await writer.WriteAsync(item, cancellationToken);

错误处理

生产者异常时,调用 writer.Complete(ex) 通知消费者。

消费者通过 try-catch 捕获遍历时的异常。

适用场景

数据流水线处理。

高吞吐量的异步任务。

多任务间的负载均衡。


C#中,System.Threading.Channels 是一个强大的异步通信机制,主要用于实现生产者-消费者模式。它提供了线程安全的通道(Channel),用于在不同线程之间传递数据。以下是关于C# Channel的详细介绍:

Channel的类型

Channel有两种类型:
有界通道(Bounded Channel):具有固定容量,当通道已满时,可以根据指定的策略处理新消息。
无界通道(Unbounded Channel):没有容量限制,适合生产者和消费者速度匹配的场景。

创建Channel

使用Channel.CreateBounded<T>创建有界通道,需要指定容量和满时的处理策略(如WaitDropNewestDropOldest等)。
使用Channel.CreateUnbounded<T>创建无界通道。

写入和读取消息

生产者通过channel.Writer.WriteAsync()方法写入消息。
消费者通过channel.Reader.ReadAsync()channel.Reader.WaitToReadAsync()读取消息。

使用场景

Channel主要用于生产者-消费者模式,可以实现高效的异步数据处理。它支持多线程操作,并可以通过SingleReaderSingleWriter属性限制通道的读写行为。

示例代码

以下是一个简单的生产者-消费者示例:

var channel = Channel.CreateBounded<int>(new BoundedChannelOptions(10)
{FullMode = BoundedChannelFullMode.Wait
});Task producer = Task.Run(async () =>
{for (int i = 0; i < 10; i++){await channel.Writer.WriteAsync(i);Console.WriteLine($"Produced: {i}");}channel.Writer.Complete();
});Task consumer = Task.Run(async () =>
{while (await channel.Reader.WaitToReadAsync()){if (channel.Reader.TryRead(out var item)){Console.WriteLine($"Consumed: {item}");}}
});await Task.WhenAll(producer, consumer);

注意事项

  • 缓冲区溢出:生产者写入速度过快可能导致缓冲区溢出。
  • 正确关闭Channel:在数据完全消费后关闭Channel,避免数据丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的牙科诊所管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

upload-labs-靶场(1-19关)通关攻略

文件上传漏洞是指由于程序员再开发时&#xff0c;未对用户上传的文件进行严格的验证和过滤&#xff0c;而导致用户可以上传可执行的动态脚本文件 Pass-01&#xff08;前端验证绕过&#xff09; 上传111.php文件&#xff0c;发现弹窗显示不允许&#xff0c;并给出白名单文件类…

使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言 在智能交通、地图定位等应用场景中&#xff0c;经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理&#xff0c;通过固定区域裁剪&#xff0c;来有效地识别出图像上显示的经纬度信息。 1. OCR 与 …

docker安装和卸载

服务器系统&#xff1a;Ubuntu Server 18.04.2 64bit 1 安装docker&#xff1a; 1.1 在线安装 1.# yum install docker 1.2 离线安装 https://download.csdn.net/download/qq_27106141/90477700 1.# docker-18.03.1-ce.tgz 1.2.1 解压 tar -xzvf docker-18.03.1-ce.tgz 1.2.2…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

【Go每日一练】构建一个简单的用户信息管理系统

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的用户信息管理系统2.&#x1f636;‍&#x1f32b;️代码开发3.&#x1f636;‍&a…

全员DeepSeek时代,前端能做些什么?

全员DeepSeek时代&#xff0c;前端能做些什么&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…

Machine Learning: 十大基本机器学习算法

机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 基本的机器学习算法&#xff1a; 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类&#xff1a; 监督学习算法 (Sup…

【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器

确认 Docker 服务状态&#xff1a; 首先&#xff0c;你需要确保 Docker 服务已经在虚拟机上安装并正确配置。你可以使用如下命令来检查 Docker 服务的状态&#xff1a; systemctl status docker.service 如果服务没有运行&#xff0c;你可以使用以下命令启动它&#xff1a; s…

前端系统测试(单元、集成、数据|性能|回归)

有关前端测试的面试题 系统测试 首先,功能测试部分。根据资料,单元测试是验证最小可测试单元的正确性,比如函数或组件。都提到了单元测试的重要性,强调其在开发早期发现问题,并通过自动化提高效率。需要整合我搜索到的资料中的观点,比如单元测试的方法(接口测试、路径覆…

linux 命令 ls

ls 是 Linux 系统中用于列出目录内容的核心命令&#xff0c;几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时&#xff0c;默认列出当前目录的内容。 可以指定文件或目录路径&#xff0c;支持通配符&#xff08;如…

CI/CD—GitLab部署

GitLab简介&#xff1a; GitLab 是一个用于代码托管和软件开发协作的平台&#xff0c;在全球开发者社区及企业中应用广泛&#xff0c;以下是对它的详细介绍&#xff1a; 主要功能 代码托管&#xff1a;提供了基于 Git 的代码仓库管理功能&#xff0c;支持创建、克隆、推送、…

ubuntu软件

视频软件&#xff0c;大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查

Easysearch 可以使用 AWS S3 作为远程存储库&#xff0c;进行索引的快照&#xff08;Snapshot&#xff09;备份和恢复。同时&#xff0c;Easysearch 内置了 S3 插件&#xff0c;无需额外安装。以下是完整的配置和操作步骤。 1. 在 AWS S3 上创建存储桶 登录 AWS 控制台&#x…

【系统架构设计师】性能评估

目录 1. 说明2. 基准测试程序3. Web服务器的性能评估4. 系统监视5. 例题5.1 例题1 1. 说明 1.性能评估是为了一个目的&#xff0c;按照一定的步骤&#xff0c;选用一定的度量项目&#xff0c;通过建模和实现&#xff0c;对一个系统的性能进行各项检测&#xff0c;对测试结果做…

动态规划-第2篇

前言&#xff1a;在上一篇文章中&#xff0c;我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解&#xff0c;动态规划为我们提供了高效的解决方案。然而&#xff0c;动态规划并不是一成不变的&#xff0c;它有很多不同的技巧和变种&#xff0c;…

基于Redis实现限流

限流尽可能在满足需求的情况下越简单越好&#xff01; 1、基于Redsi的increment方法实现固定窗口限流 Redis的increment方法保证并发线程安全窗口尽可能越小越好(太大可能某一小段时间就打满请求剩下的都拿不到令牌了)这个原理其实就是用当前时间戳然后除窗口大小 在这个窗口大…

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目&#xff08;详细教程&#xff09; Spring Boot 以其简洁、高效的特性&#xff0c;成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导&#xff0c;但 社区版&#xff08;Community Edition&#xff09…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展&#xff0c;性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件&#xff0c;凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力&#xff0c;引起了广泛关注。本文将从配置性…

紧急救援!MySQL数据库误删后的3种恢复方案

一、误删场景分类与恢复策略 ‌常见误操作场景‌: DROP TABLE 误删单表(高频事故)DELETE 误删数据(可通过事务回滚抢救)DROP DATABASE 删除整个库(需全量备份)服务器rm -rf(物理文件删除)‌恢复方案选择矩阵‌: 场景推荐方案时间窗口表结构删除(DROP)备份恢复 + B…