HowTo:使用数据流读写消息
本文主要演示使用TPL 数据流库从数据流块(dataflow block)读写消息。
提供了同步方法和异步方法。
主要使用BufferBlock,其既能作为message source,有能作为message target。
- Install-Package Microsoft.Tpl.Dataflow
 - using System.Threading.Tasks.Dataflow;
 
1.同步方法读写消息
1.1 分别使用Post和Receive方法进行读写。
- public
void SynchronouslyPostAndReceive() - {
 - var bufferBlock = new BufferBlock<int>();
 - for (int i = 0; i < 3; i++)
 - {
 - bufferBlock.Post(i);
 - }
 - for (int i = 0; i < 3; i++)
 - {
 - Console.WriteLine(bufferBlock.Receive());
 - }
 - }
 
输出:
0
1
2
解释:

从Post方法可以看出,此时BufferBlock扮演着ITargetBlock的角色;
同理,Receive方法调用时,BufferBlock扮演着ISourceBlock的角色;
这也就证明了BufferBlock同时用作Target和Source。已可以看出,同步的时候,BufferBlock实际上是FIFO。
1.2 使用TryReceive来读取
- public
void SynchronouslyPostAndReceive() - {
 - var bufferBlock = new BufferBlock<int>();
 - for (int i = 0; i < 3; i++)
 - {
 - bufferBlock.Post(i);
 - }
 - //for (int i = 0; i < 3; i++)
 - //{
 - // Console.WriteLine(bufferBlock.Receive());
 - //}
 - int
value; - while (bufferBlock.TryReceive(out
value)) - {
 - Console.WriteLine(value);
 - }
 - }
 
输出:
0
1
2
1.3并发读写
使用Task,将读写放在不同的线程。
当Receive,且无数据时,则会阻塞。
- public
void ConcurrentlyPostAndReceive() - {
 - var bufferBlock = new BufferBlock<int>();
 - var post01 = Task.Run(() =>
 - {
 - bufferBlock.Post(1);
 - bufferBlock.Post(2);
 - bufferBlock.Post(3);
 - bufferBlock.Post(4);
 - });
 - var receive = Task.Run(() =>
 - {
 - for (int i = 0; i < 6; i++)
 - {
 - Console.WriteLine(bufferBlock.Receive());
 - }
 - });
 - var post02 = Task.Run(() =>
 - {
 - bufferBlock.Post(5);
 - bufferBlock.Post(6);
 - });
 - Task.WaitAll(post01, receive, post02);
 - }
 
输出:
5
1
2
3
4
6
2.异步方式读写消息
主要是TAP的一种套用。使用async 和await来实现。
- static async Task AsyncSendReceive(BufferBlock<int> bufferBlock)
 - {
 - // Post more messages to the block asynchronously.
 - for (int i = 0; i < 3; i++)
 - {
 - await bufferBlock.SendAsync(i);
 - }
 - // Asynchronously receive the messages back from the block.
 - for (int i = 0; i < 3; i++)
 - {
 - Console.WriteLine(await bufferBlock.ReceiveAsync());
 - }
 - }
 - public
void Start() - {
 - AsyncSendReceive(new BufferBlock<int>()).Wait();
 - }
 
HowTo:使用数据流读写消息的更多相关文章
- HDFS的数据流读写数据 (面试开发重点)
		
1 HDFS写数据流程 1.1 剖析文件写入 HDFS写数据流程,如图所示 1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是 ...
 - 队列Queue:任务间的消息读写,安排起来~
		
摘要:本文通过分析鸿蒙轻内核队列模块的源码,掌握队列使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三 消息队列Queue>,作者:zhushy . 队列(Queue)是 ...
 - 分布式消息队列 Kafka
		
分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala具有高吞吐.可扩展.分布式等特点 适用场景 活动数据 ...
 - System V IPC(1)-消息队列
		
一.概述 System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&am ...
 - 【转】快速理解Kafka分布式消息队列框架
		
from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...
 - 快速理解Kafka分布式消息队列框架
		
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ ==是什么 == 简单的说,K ...
 - Kafka分布式消息模型
		
Kafka开发的主要初衷目标是构建一个用来处理海量日志,用户行为和网站运营统计等的数据处理框架.在结合了数据挖掘,行为分析,运营监控等需求的情况下,需要能够满足各种实时在线和批量离线处理应用场合对低延 ...
 - 使用JDK自带的MessageDigest计算消息摘要
		
使用JDK自带的MessageDigest计算消息摘要 上代码 /** * 使用JDK自带MessageDigest */ public class MessageDigestUtils { /** ...
 - [转载] 快速理解Kafka分布式消息队列框架
		
转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...
 
随机推荐
- Ubuntu自定义服务
			
1.准备脚本 准备好一个bash服务脚本,包括start|stop|restart等参数,将脚本文件命名为“服务名”,拷贝到/etc/init.d/目录下. 2.添加服务sudo update-rc. ...
 - lnmp初步学习知识整理
			
Linux常用30个命令 1.帮助命令 1) man 就是manual的缩写,用来查看系统中自带的各种参考手册(一般linux系统中自带英文手册)! man 命令名 //查看该命令的介绍 2) 命令名 ...
 - 关于logcat日志
			
最近学习android,碰到了logcat,个人总结一下. 当不出日志是解决办法: ProjectMenu---后台设置----LOG设置---LOG开关 Logcat(deprecated)和Log ...
 - Android -- android.os.Parcelable[] cannot be cast to ...
			
我本想直接把Bunde.getParcelableArray(...)得到的Parcelable[]强制转换为自定义类数组,但是失败了,网上找了两种解决办法: Parcelable[] data =b ...
 - EF学习 笔记-----EF映射
			
http://www.cnblogs.com/guomingfeng/archive/2013/06/15/mvc-ef-configuration-migration.html EF flountA ...
 - JDBC 精度
			
http://www.cnblogs.com/tobecrazy/p/3390021.html http://www.cnblogs.com/kerrycode/p/4034231.html http ...
 - IBM AppScan 安全扫描:支持弱 SSL 密码套件                                                    分类:            数据安全             2014-06-28 11:34    1844人阅读    评论(0)    收藏
			
问题描述:  解决方法: 1.Server 2008(R2) 根据appScan的修订建议访问地址:http://msdn.microsoft.com/en-us/library/windows/d ...
 - java 杂物间 (二) Spring Web
			
需要明确记住的继承关系
 - C# Settings使用小结
			
本篇博客将介绍C#中Settings的使用. 首先介绍一个桌面程序中的例子,当我们新安装一个软件,软件启动后会有例如新手指导等窗体弹出来,每次都需要自己去关闭它.当然这些软件都会提供例如不再显示等功能 ...
 - 第十九篇:提高SOUI应用程序渲染性能的三种武器
			
SOUI是一套100%开源的基于DirectUI的客户端开发框架. 基于DirectUI设计的UI虽然UI呈现的效果可以很炫,但是相对于传统的win32应用程序中每个控件一个窗口句柄的形式,渲染效率是 ...