BusterWood.Channels是一个在C#上实现的信道的开源库。通过使用这个类库,我们可以在C#语言中实现类似golang和goroutine的信道编程方式。在这里我们介绍3个简单的信道的例子。 
 

通过信道发送消息(https://gobyexample.com/channels): 
static void SimpleMessage()
{
var channel = new Channel<String>();
Task.Run(async () => {
await channel.SendAsync("Hello World!");
});
var message = channel.Receive();
Console.WriteLine(message);
}

在上面这个例子中,我们在TPL Task中通过信道发送消息。主线程通过Receive接收消息。这里,由于我们的SimpleMessage方法不是一个async方法,我们不能使用ReceiveAsync来接收消息。

 

static void ChannelSychronization()
{
var channel = new Channel<bool>();
Task.Run(async () => {
Console.Write("Working...");
await Task.Delay();
Console.WriteLine("done");
await channel.SendAsync(true);
});
channel.ReceiveAsync().Wait();
}

在这个例子中,主线程被ReceiveAsync堵塞,当TPL Task发送消息后,程序才结束。

选择多个信道(https://gobyexample.com/select): 
当我们需要从多个信道中接收信息时,我们可以用Select来实现:
static void Select()
{
var channel1 = new Channel<String>();
var channel2 = new Channel<String>(); Task.Run(async () => {
await Task.Delay();
await channel1.SendAsync("one");
});
Task.Run(async () => {
await Task.Delay();
await channel1.SendAsync("two");
}); for (var i = ; i < ; i++)
{
new Select()
.OnReceive(channel1, msg1 => {
Console.WriteLine("received " + msg1);
})
.OnReceive(channel2, msg2 => {
Console.WriteLine("received " + msg2);
}).ExecuteAsync().Wait();
}
}

在上面的例子中,我们通过Select同时从两个信道channel1和channel2接收信息。

 

这个C#的开源库可以在https://github.com/busterwood/Channels找到代码,nuget文件名为BusterWood.Channels,最新版支持 .net 4.6和 .net core。上面例子的代码可以在https://github.com/mcai4gl2/ChannelExamples找到,例子代码可以在.net core上运行。 这里我们只介绍了几个信道的基本应用,以后我们还会进一步介绍更多的信道的例子。

在C#中使用类golang信道编程(一)的更多相关文章

  1. Delphi中线程类TThread实现多线程编程1---构造、析构……

    参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...

  2. 转发 Delphi中线程类TThread 实现多线程编程

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  3. Android 编程 AMapLocationClientOption 类中的 setNeedAddress 方法用处 (高德地图 com.amap.api.location.AMapLocationClientOption 中的类)

    最近在用高德地图来写Android App, 其中有一些 方法是不太理解的,这里写一下 对  高德地图  com.amap.api.location.AMapLocationClientOption ...

  4. Golang面向对象编程-struct(结构体)

    Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...

  5. golang 面向对象编程

    概述 Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承:与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入.聚合和嵌入的区别: t ...

  6. Golang - 并发编程

    目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...

  7. Golang核心编程

    源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...

  8. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  9. JAVA中的类和接口

    1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

随机推荐

  1. git 由http切换成git

    项目中经常会遇到http 的git 协议为了安全切换成ssh 的git 协议. 这个时候,只要使用如下命令变更 remote 字符串就好了. git remote set-url origin git ...

  2. 使用git部署服务器

    每回上传服务器是把我的web项目打包成war上传到服务器根目录下,总是觉得很麻烦,并且每次就算只添加或修改了一个文件,都要把整个服务器war包上传.于是我学着用git部署我的web项目 下面是详情: ...

  3. [转]利用excel进行线性规划求解

                           利用线性回归方法求解生产计划 方法一: 1.建立数学模型: 设变量:设生产拉盖式书桌x台,普通式书桌y台,可得最大利润 ‚确定目标函数及约束条件 目标函 ...

  4. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  5. java学习(二)多态中成员变量详解

    今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...

  6. java学习笔记 --- 方法

    一.方法  (1)方法:就是完成特定功能的代码块.   注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法.  (2)格式:   修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 ...

  7. Android编码规范

    Android-Code-Style 1.约定 Activity.onCreate(),Fragment.onActivityCreated(),紧跟成员变量后,方法内部保持简单,尽量只调用initX ...

  8. 从零开始学习springboot之springboot搭建

    博主刚开始实习不久,还是小白一枚,被公司的各种新奇技术搞得眼花缭乱了好久,主要是用springboot和dubbo构建起来的项目.看完之后才知道springboot真的是java开发者的福音啊 话不多 ...

  9. 自己写的一个 java swing 的闹钟

    上一周新入职,把代码down下来之后,领导和我讲了一些大概的业务以及代码流程(领导是技术出身),领导让我自己先看看代码,然后我看了两天,觉得已经完全可以接任务了,但是领导却迟迟没有分配任务给我,虽然他 ...

  10. 深入分析Java单例模式的各种方案

    单例模式 Java内存模型的抽象示意图: 所有单例模式都有一个共性,那就是这个类没有自己的状态.也就是说无论这个类有多少个实例,都是一样的:然后除此者外更重要的是,这个类如果有两个或两个以上的实例的话 ...