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开发的一个分布式的消息 ...
随机推荐
- 网站上点击自定义按钮发起QQ聊天的解决方案
一.背景 最近由于开发需要,需要在网站上自定义一个立即交谈的按钮,现将解决方式分享给大家. 二.解决方案 1.首先访问:http://shang.qq.com/widget/consult.php,适 ...
- 一分钟可知css3版大白源码
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Redis事件管理(二)
Redis的定时器是自己实现的,不是很复杂.说说具体的实现吧. 定时器的存储维护采用的是普通的单向链表结构,具体节点定义为: /*时间定时器结构体*/ typedef struct aeTimeEve ...
- 聊聊Android的APK反编译
上一篇<How To Use Proguard in Android APP>介绍了如何对Android进行混淆,现在来对它进行反编译看看,里面有些什么东西. APK文件,其实也是一个压缩 ...
- 1.4 算法 - algorithm
1)概述 2)示例 //algorithm find演示 #include <vector> #include <algorithm> #include <iostrea ...
- 2.2 顺序容器-list
list(双向链表) 1) * :包含头文件list **:不支持随机存取:增删元素时间是常数,只需要修改指针 2)成员函数 * :vector的成员函数list基本都有 **:以下是部分独有成员 ...
- hdu 2057 A+B
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 For each test case,print the sum of A and B in h ...
- MVC - 11(上).DTO
1.重要:javaScriptSerializer 无法识别被序列化的对象里各种属性是否存在 循环依赖 (System,Web.Script.Serialization.JavaScriptSeri ...
- android 屏幕旋转
转自:http://blog.csdn.net/oyzhizhong/article/details/8131799 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要 ...
- ListView 完全优化 + 多种listitem布局处理
# 百度了下,感觉下面的博客文章还都挺全面的,写的很好,直接分享得了 Android性能优化--Listview优化 - tonycheng93 - 博客园http://www.cnblogs.co ...