C# Channel实现线程间通信

C# Channel实现线程间通信

同步方式实现:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;namespace ConsoleApp1
{public class ChannelDemo{static Channel<Message> channel1 = Channel.CreateUnbounded<Message>();public static void Main2(){sender.Start(1);receive1.Start(2);receive2.Start(3);sender.Join();Thread.Sleep(3000);receive1.Interrupt();receive2.Interrupt();receive1.Join();receive2.Join();Console.ReadKey();}static Thread sender = new Thread(SendMsg);static Thread receive1 = new Thread(ReceiveMsg);static Thread receive2 = new Thread(ReceiveMsg);static void SendMsg(object id){for (int i = 0; i < 20; i++){if (channel1.Writer.TryWrite(new Message((int)id, i.ToString()))){Console.WriteLine($"【线程{id}】发送了【{i}】");}}}static void ReceiveMsg(object id){try{while (true){if (channel1.Reader.TryRead(out Message message)){Console.WriteLine($"【线程{id}】从【线程{message.id}】接收了【{message.content}】");}Thread.Sleep(1);}}catch (ThreadInterruptedException ex){Console.WriteLine($"接收结束");}}}
}

异步方式:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Channels;
using System.Text;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;namespace ConsoleApp1
{public class ChannelDemo2{static Channel<Message> channel1 = Channel.CreateUnbounded<Message>();public static async void Main2(){await Task.WhenAll(sender, sender2);channel1.Writer.Complete();await Task.WhenAll(receive1, receive2);Console.ReadKey();}static Task sender = SendMsgAsync(channel1.Writer, 1);static Task sender2 = SendMsgAsync(channel1.Writer, 4);static Task receive1 = ReceiveMsgAsync(channel1.Reader, 2);static Task receive2 = ReceiveMsgAsync(channel1.Reader, 3);static async  Task SendMsgAsync(ChannelWriter<Message> writer, int id){for (int i = 0; i < 20; i++){await writer.WriteAsync(new Message((int)id, i.ToString()));Console.WriteLine($"【线程{id}】发送了【{i}】");}}static async Task ReceiveMsgAsync(ChannelReader<Message> reader,int id){try{while (!reader.Completion.IsCompleted){Message message = await reader.ReadAsync();           Console.WriteLine($"【线程{id}】从【线程{message.id}】接收了【{message.content}】");}}catch (ChannelClosedException ex){Console.WriteLine($"ChannelClosed 接收结束");}}}
}

在对Channel进行实例化的时候,也可以传递一个Options,这里面可以对消息容量,是否多个发送者和接受者进行定义。

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

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

相关文章

【JavaFX】实现计算器小程序

下面是一个简单的JavaFX计算器示例: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.…

西南科技大学数字电子技术实验四(基本触发器逻辑功能测试及FPGA的实现)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) (1)D触发器 特征方程: Q…

往adobe illustrator中添加latex字体

找到如下字体所在路径 /path/to/miktex/type1\public\amsfonts\cm然后copy相应的字体文件 cmmi10.pfb将相应的pfb文件复制到Adobe illustrator字体文件夹: /path/to/illustrator/Support Files/Required/Fonts然后重启即可。

ChatGPT/GPT4应用:文本、论文、编程、绘图等,提高工作效率及科研项目开发能力

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

排序-选择排序与堆排序

文章目录 一、选择排序二、堆排序三、时间复杂度四、稳定性 一、选择排序 思想&#xff1a; 将数组第一个元素作为min&#xff0c;然后进行遍历与其他元素对比&#xff0c;找到比min小的数就进行交换&#xff0c;直到最后一个元素就停止&#xff0c;然后再将第二个元素min&…

【单调栈】【二分查找】LeetCode: 2454.下一个更大元素 IV

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 单调栈 题目 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数&#xff0c;你必须找到对应元素的 第二大 整数。 如果 nums[j] 满足以下条件&#xff…

音视频技术开发周刊 | 323

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Meta牵头组建开源「AI复仇者联盟」&#xff0c;AMD等盟友800亿美元力战OpenAI英伟达 超过50家科技大厂名校和机构&#xff0c;共同成立了全新的人工智能联盟。以开源为旗号…

RocketMQ的架构是什么样的❓

RocketMQ&#xff0c;作为一款强大的分布式消息中间件&#xff0c;广泛应用于各种大规模分布式系统中&#xff0c;为异步消息通信提供了可靠的解决方案。本文将深入探讨RocketMQ的核心组件&#xff0c;包括Producer、Broker、Consumer和NameServer&#xff0c;以及它们在整个架…

高中物理电学总结之稳恒电流篇

高中物理电学总结之稳恒电流篇 电流电流的定义对电流的微观分析 电阻欧姆定律电阻的串并联电阻定律 电源的电动势电源电动势 闭合电路欧姆定律闭合电路闭合电路欧姆定律 电流做功与焦耳定律电流做功电功率焦耳定律电源效率 电表改装 电流 电流的定义 电解质溶液中的自由电荷是…

ACwing算法备战蓝桥杯——Day30——树状数组

定义&#xff1a; 树状数组是一种数据结构&#xff0c;能将对一个区间内数据进行修改和求前缀和的这两种操作的最坏时间复杂度降低到O(logn); 实现所需变量 变量名变量数据类型作用数组a[]int存储一段区间数组tr[]int表示树状数组 主要操作 函数名函数参数组要作用lowbit()int…

Linux-RedHat系统-安装 中间件 Tuxedo

安装步聚 一、中间件安装包&#xff1a; tuxedo121300_64_Linux_01_x86 Tuxedo下载地址&#xff1a; Oracle Tuxedo Downloads 二、新建用户&#xff1a; &#xff08;创建Oracle用户时&#xff0c;需要root权限操作&#xff09; 创建用户&#xff1a; # useradd oracle …

es6从url中获取想要的参数

第一种方法 很古老&#xff0c;通过 split 方法慢慢截取&#xff0c;可行是可行但是这个方法有一个弊端&#xff0c;因为 split 是分割成数组了&#xff0c;只能按照下标的位置获取值&#xff0c;所以就是参数位置一旦发生变化&#xff0c;那么获取到的值也就错位了 let user…

利用python将data:image/jpg; base64,格式数据转化下载为图片

在做爬虫爬取图片时&#xff0c;发现有的图片url是用“data:image/jpg;base64” 开头的&#xff0c;例如下图 部分开头样式如下&#xff1a; 1、data:image/jpg; base64, 2、data:image/png; base64, 3、data:image/webp;base64, 利用python进行代码进行图片下载&#xff0c;…

面向对象设计与分析40讲(22)罪恶的单例模式?

单例模式曾经被认为是一种重要的设计模式&#xff0c;但现在已经失去了很多开发者的青睐。虽然单例模式可能仍然适用于某些场景&#xff0c;但它的使用已经不再像过去那样普遍了。 单例模式是创建型设计模式的一种&#xff0c;它限制了一个类的实例化只能为一个实例&#xff0…

先进的Web3.0实战热门领域NFT项目几个总结分享

非同质化代币&#xff08;NFT&#xff09;的崛起为游戏开发者提供了全新的机会&#xff0c;将游戏内物品和资产转化为真正的可拥有和交易的数字资产。本文将介绍几个基于最先进的Web3.0技术实践的NFT游戏项目&#xff0c;并分享一些相关代码。 Axie Infinity&#xff08;亚龙无…

智能优化算法应用:基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猫群算法4.实验参数设定5.算法结果6.参考文献7.MA…

C++ extern “C“ 用法

extern “C” 由于c中需要支持函数重载&#xff0c;所以c和c中对同一个函数经过编译后生成的函数名是不相同的 extern “C” 的主要作用就是为了实现c代码能够调用其他 c 语言代码。 1(不常用) //告诉编译器 show() 函数按c语言的方式进行编译和链接 extern "C" voi…

MySQL数据库概念与实践

MySQL数据库概念与实践 1. 概念 MySQL是一种常用的关系型数据库管理系统&#xff0c;具有丰富的功能和广泛的应用。在本篇博客中&#xff0c;我们将介绍MySQL数据库的一些重要概念和相关知识。 存储引擎 存储引擎是MySQL数据库用于存储、更新和查询数据的技术实现方法。MyS…

Python安装第三方库出错

Python 程序包镜像的国内源如下&#xff1a; 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple/豆瓣(douban): https://pypi.douban.com/simple/阿里云: https://mirrors.aliyun.com/pypi/simple/中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/ 使用方法&#xf…

件夹和文件比较软件VisualDiffer mac功能介绍

VisualDiffer mac是一款运行在MacOS上的文件夹和文件快速比较工具。VisualDiffer可以对不同文件夹中文件或文档做出比较或者比较两个文件的路径。还可以通过UNIS diff命令快速、标准和可靠的比较出各类不同的文件夹和文件结果&#xff0c;使用不同的颜色直观地显示。 VisualDif…