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. 机器学习基石 4 Feasibility of Learning

    机器学习基石 4 Feasibility of Learning Learning is Impossible? 机器学习:通过现有的训练集 \(D\) 学习,得到预测函数 \(h(x)\) 使得它接 ...

  2. HTML5学习笔记<二>:元素,属性,格式化

    HTML元素 元素是指从开始标签到结束标签的所有代码. 开始(开放)标签 元素内容 结束(闭合)标签 <p> this is my web page </p> 没有内容的 HT ...

  3. [ZooKeeper.net] 3 ZooKeeper的分布式锁

    基于ZooKeeper的分布式锁 ZooKeeper 里实现分布式锁的基本逻辑: 1.zookeeper中创建一个根节点(Locks),用于后续各个客户端的锁操作. 2.想要获取锁的client都在L ...

  4. [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建

    [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建 1.概述 读前必备:认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET ...

  5. Alamofire源码解读系列(十一)之多表单(MultipartFormData)

    本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...

  6. Android之仿京东淘宝的自动无限轮播控件

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...

  7. jQuery ajax 与服务器交互方法

    1.HTML <table> <tr> <td>用户名:</td> <td><input type="text" ...

  8. Linux环境下的IDE,极大提升编程效率

    "一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是 ...

  9. spring security 3.x 多页面登录配置入门教程

    最近在最shiro的多入口登录,搞了好久,就把spring security拿出来再炒一下,这是我以前在csdn写过的一篇博客. spring security 是一个权限控制的框架.可以很方便地实现 ...

  10. 【Hexo】(一)使用HEXO配置环境,创建Hello World

    现场直播,呵呵,就是我完成一步,就记录一下: 一.配置环境 1.安装 Node 下载地址:Node.js 2.安装 Git(win环境下) 下载地址:Git Git 绑定 GitHub账户: ①打开G ...