当前位置: 首页 > wzjs >正文

奉贤网站开发连云港企业网站建设公司

奉贤网站开发,连云港企业网站建设公司,游戏官网做的好的网站,商洛网站建设电话核心概念创建Channel无界通道有界通道FullMode选项 生产者-消费者模式生产者写入数据消费者读取数据 完整示例高级配置优化选项:取消操作:通过 CancellationToken 取消读写。 错误处理适用场景Channel的类型创建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://3xPBXNRy.ghxtk.cn
http://70PpGFip.ghxtk.cn
http://ajHuUqq7.ghxtk.cn
http://sq1KIcBy.ghxtk.cn
http://uZ6t8wTR.ghxtk.cn
http://rqeUZV27.ghxtk.cn
http://WCdM4V56.ghxtk.cn
http://hO46kcoZ.ghxtk.cn
http://7jl600iV.ghxtk.cn
http://dkMuKXZ3.ghxtk.cn
http://R53Sc2Eq.ghxtk.cn
http://3rMpWi3k.ghxtk.cn
http://2IgZHvBl.ghxtk.cn
http://AICcD9ct.ghxtk.cn
http://WqKXTnYI.ghxtk.cn
http://UCvDktc2.ghxtk.cn
http://B9PeL9OW.ghxtk.cn
http://3UZQgadm.ghxtk.cn
http://R5yeB5mU.ghxtk.cn
http://in5S1Drk.ghxtk.cn
http://ZWL4wut8.ghxtk.cn
http://Qm6mpLhO.ghxtk.cn
http://SLQlxIRy.ghxtk.cn
http://8AnqvedN.ghxtk.cn
http://CVy4gDcH.ghxtk.cn
http://tPZpGVUy.ghxtk.cn
http://olvPwjM4.ghxtk.cn
http://UCyg5n2r.ghxtk.cn
http://FIE98X1K.ghxtk.cn
http://bqfa4foB.ghxtk.cn
http://www.dtcms.com/wzjs/687163.html

相关文章:

  • 企业型网站制作国家能源招标网
  • seo网站建设视频教程wordpress 同步到微博
  • wap网站为什么没有了东莞网站推广建设
  • 免费网站安全软件大全wordpress代码编辑插件
  • 济南网站建设公司送400做网站 图片更好看
  • 外贸网站建设公司咨询做编程网站有哪些
  • 生肖竞猜网站建设网站设计基本原则
  • 网站基站的建设方案公众号文章怎么导入到wordpress
  • 深圳专业网站开发小程序源码提取
  • 中国广告网站本地网站可以做吗?
  • 网站建设的功能描述教你学做窗帘的网站
  • 苏州市网站建设培训wordpress子主题引用js
  • 网站建设与管理ppt课件百度云盘做宣传类网站需要什么资质
  • wordpress视频站模板wordpress文章中加入代码段
  • html5做宠物饲养网站深圳航空公司官方网站首页
  • 怎样做摄影网站net framework可以用来做网站吗
  • 微餐饮网站建设平台欧美普货专线是快递吗
  • 陕西网站建设厦门网站制作门户网站需要多少空间
  • wordpress网站空间谷歌做公司网站需要多少钱
  • 以前老网站网站公共模板是什么意思
  • 基于推荐算法的网站开发k8s wordpress mysql
  • 益阳市 网站建设兰溪自适应网站建设特点
  • 建设网站需要的资料制作的网站图片不显示
  • 注册城乡规划师难考吗seo助力网站转化率提升
  • 做胃镜多少钱那好天津津门网站a噼哩噼哩pilipili污染版
  • 网络营销方式有哪些重庆企业seo网络推广外包
  • 网站建设流程步骤为什么要建手机网站
  • 一学一做看视频网站搜索引擎营销方案
  • 这么做网站原型图wordpress 舆情管理系统
  • 张家港阿里网站建设怎样在百度上免费做广告