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开发的一个分布式的消息 ...
随机推荐
- September 8th 2016 Week 37th Thursday
The secret of high-impact business is early preparation. 高效商务,赢在未雨绸缪. Early and best preparation is ...
- August 8th 2016, Week 33rd Monday
Everything is going on, but don't give up trying. 万事随缘,但不要放弃努力. Every time when I want to give up, y ...
- #import、#include、#import<>和#import””的区别
一.#import与#include #import不会引起交叉编译的问题.因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用#include引入头文件,会导致交叉编译 ...
- C# 使用Conditional特性而不是#if条件编译
概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版.但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解 ...
- 【翻译十三】java-并发之饥饿与活锁
Starvation and Livelock Starvation and livelock are much less common a problem than deadlock, but ar ...
- python threading编程中的LOCK和RLOCK(可重入锁)
找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...
- gdo图形引擎中的旋转角
横滚角(Roll) bank.roll 绕y轴 z轴正向为起点逆时针方向:往左为正,往右为负,水平时为0:有效范围:-180度-180度 注:下图是从飞机的尾部-->头部方向观察所得 俯仰角( ...
- 11g SQL Monitor
1,首先确认两个参数的值 SQL> show parameter statistics_level NAME TYPE VALUE ------- ...
- Auto Layout
Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...
- php获取当前页面的完整url
javascript实现: top.location.href 顶级窗口的地址 this.location.href 当前窗口的地址 php实现: //测试网址: http://localhost/b ...