首页 > 编程语言 >C#使用Channel实现异步任务之间的通信

C#使用Channel实现异步任务之间的通信

时间:2024-02-24 22:26:06浏览次数:26  
标签:异步 C# await int Channel var message id channel

channel中也是有一个ConcurrentQueue来维护的

using System.Threading.Channels;

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

//在赋值的时候,两个Task就开始执行了,下面的await就是为了等待执行完成
var sender1 = SendMessageAsync(channel.Writer, 1);
var sender2 = SendMessageAsync(channel.Writer, 2);
var receiver = ReceiveMessageAsync(channel.Reader, 3);

await Task.WhenAll(sender1, sender2);
channel.Writer.Complete();
await receiver;

async Task SendMessageAsync(ChannelWriter<Message> writer, int id)
{
    for (int i = 0; i <= 20; i++)
    {
        await writer.WriteAsync(new Message(id, i.ToString()));
        Console.WriteLine($"Thread {id} sent {i}");
        await Task.Delay(100);
    }
}

async Task ReceiveMessageAsync(ChannelReader<Message> reader, int id)
{
    // try
    // {
    //     while (!reader.Completion.IsCanceled)
    //     {
    //         var message = await reader.ReadAsync();
    //         Console.WriteLine($"Thread {id} received {message.Content} from {message.FromId}");
    //     }
    // }
    // catch (ChannelClosedException)
    // {
    //     Console.WriteLine($"Thread {id} channel closed");
    // }

    await foreach (var message in reader.ReadAllAsync())
    {
        Console.WriteLine($"Thread {id} received {message.Content} from {message.FromId}");
    }
}

record Message(int FromId, string Content);

标签:异步,C#,await,int,Channel,var,message,id,channel
From: https://www.cnblogs.com/xavierxiu/p/18031626

相关文章

  • 解决nvidia-smi报错:NVIDIA-SMI has failed because it couldn‘t communicate with th
    昨天一切正常,今天ubuntu启动突然卡住了,一直停在黑屏光标界面。在网上看到原因可能和nvidia驱动有关。输入nvidia-smi报出题目中的错误。一般这种错误都是在刚安装nvidia驱动后第一次启动可能出现,见我这篇文章。不过这次是突然出现的,不是安装驱动后出现的,所以不是安装nvidia驱......
  • CF1924C
    发现这个东西有一种隐隐约约的递推藏在里面,然后发现确实是递推。具体的,我们注意到一个正方形先进行第一次折,我们发现实际上它分成了\(4\)个小正方形,这四个小正方形是互相独立的,然后折完一次后它们都变成了一个三角形,我们试着分析每个三角形在后一次是怎么折的,发现折完以后还会......
  • Codeforces 1025F Disjoint Triangles
    结论:如果两个三角形不相交,那么一定存在两条内公切线。于是可以考虑枚举这条内公切线的端点\(x,y\)。那么一个三角形的两个端点就会在\(x\toy\)这条线的同一侧,另外一个三角形的两个端点会在这条线的另一侧。同时这条线的一侧与其配对的端点可能是\(x\)也可能是\(y\)。......
  • java中break和continue
    break和continue的区别点击查看代码publicclassforDemo05{publicstaticvoidmain(String[]args){//循环数组int[]arr={12,23,42,12,42};for(intx:arr){if(x==23){//System.out.println("当前已......
  • javacpp是什么?
    javaCPP提供了在Java中高效访问本地C++的方法。采用JNI技术实现,支持所有Java实现包括Android系统,Avian和RoboVM。 JavaCPP提供了一系列的Annotation将Java代码映射...IntroductionJavaCPPprovidesefficientaccesstonativeC++insideJava,notunlikethewaysomeC/C......
  • 【安装记录】sourceinsight使用小tips
    1、官网下载安装包,一路next(中间安装目录自己选择)2、免费的只有30天,因此选择破解,参考的下面教程:https://www.jb51.net/article/259589.htm3、更改字体大小一致笔者第一次使用SourceInsight,刚一打开发现,哎呀妈呀,这个字体为什么有的大有的小,看得好晕(真的!十分钟都不到我就已经头......
  • python dict 哈希表
    哈希值Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素:根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作:哈希值在对象整个生命周期内不能改变;可比较,且比较相等的对象哈希值必须相同;满足这两个条件的对象便是......
  • follow-redirects 可以直接替换node http & https 的npm 模块
    follow-redirects可以直接替换nodehttp&https的npm模块包含的特性支持重定向功能支持重定向参数配置,比如最大重定向,以及最大请求大小,支持beforeredirect请求处理(比如认证处理)支持agents说明对于业务系统的请求会包含重定向场景的,follow-redirects是一个很不错的选......
  • CTFer——RCE命令执行漏洞
    例题总结:CTFshow29:if(!preg_match("/flag/i", $c)){        eval($c);(eval内执行的是php代码,必须以分号结尾)绕过方式:(1)?c=system("cat%20fla*");fla*代替flag (2) ?c=eval($_GET[1]);&1=phpinfo();参数输入加eval(3)?c=echo`catfla*`; 30:if(!preg_ma......
  • JavaScript语法-字符串模板
    [TOC]##JavaScript模板字符串###代码以下是index.js的部分代码:```onShareAppMessage({const{toName,mainText,fromName}=this.data;debugger;return{title:'叮,您收到一张贺卡~',path:'pages/index/index?toname=${toName}&mai......